2015-01-19 2 views
2

우리는 T의 널 참조를 리턴 할 수 있어야하는 일반 메소드가 있다고 가정하고, 따라서 T는 널 입력 가능해야합니다. 이 같은의코드 계약에서 제네릭 형식에 대해 Null 허용 여부를 적용 할 수 있습니까?

종류 :

public static T GetNullableTypeTest<T>() 
{ 
    Contract.Requires(!typeof(T).IsValueType || Nullable.GetUnderlyingType(typeof(T)) != null); 
    return (T)(object)null; 
} 

CC는 우리가 무엇을하려고 전혀 이해하지 않는 것, 그것은에 "검증되지 않은"경고에 언 박싱 널 및 방법 호출 결과에 대해 불평.

코드 계약에서이 제약 조건을 적용 할 수있는 방법이 있습니까?

+0

이 시나리오에서 [제약 조건은 유용하지 않습니다.] (http://stackoverflow.com/q/19831157/1207195) CC는 해당 호출을 신뢰할 수 없습니다. 당신이 할 수있는 일은 (아마도 "하지 않을 수도") 할 수있는 것은 다른 T 클래스에 대해 별도의 메소드를 가지거나 디버그 빌드 런타임 선언에 만족하는 것입니다. –

+1

@AdrianoRepetti 이것이 CC에 의해 이해되지 않는 이유는 무엇입니까? 우리가 사용할 수있는 평가의 종류에 대한 정식 정의가 있습니까? – Alex

+1

나는 단순히 CC가 _deep_ 함수 호출에서 그것을 이해할 수 없다고 추측한다.이 체크를 대체하기 위해서 당신은'ContractArgumentValidatorAttribute'를 사용할 수있다. (그러나 나는 다시 시도하지 않았다). –

답변

1

이것은 코드 계약 문제가 아닙니다. 이처럼, 당신의 방법에 제약을 넣어해야합니다

public static T GetNullableTypeTest<T>() where T : class 

이 방법이부터 T. 같은 값 유형을 전달 호출 할 수 없습니다이 방법은, 당신의 방법의 본문에 의미있는 계약을했습니다.

+2

'T'를 참조 형식으로 제한하고 (계약서의 첫 번째 조건) 'T'를 Nullable (계약서의 두 번째 조건)으로 허용하지 않습니다. –

+0

그럼 나는 그 목표를 완전히 이해하지 못했습니다. 그렇다면 System.Nullable을 형식 제약 조건에서 사용할 수 없기 때문에 단일 메서드로는 수행 할 수 없다고 생각합니다. –