2011-10-09 2 views
2

사전 조건 코드 계약으로서 참조 유형이 null 인 것을 방지하기 위해 래퍼 클래스를 작성했습니다.C#의 래퍼 자동 변환

public sealed class NotNullable<T> 
    where T : class 
{ 
    private T t; 

    public static implicit operator NotNullable<T>(T otherT) 
    { 
     otherT.CheckNull("Non-Nullable type"); 
     return new NotNullable<T> {t = otherT}; 
    } 

    public static implicit operator T(NotNullable<T> other) 
    { 
     return other.t; 
    } 

} 

이 미세하게 작동하지만, 캐스트는 항상 Null 허용을 처리 할 때처럼 필요 :

public void Foo(NonNullable<Bar> bar) 
{ 
    Console.WriteLine((Bar)bar); 
} 

는 타입 T의 것처럼 유형 Null을 행동하라의 매개 변수를 가질 수 있을까, 그것을 캐스팅하지 않고도? 처럼 사양 #에 :

Console.WriteLine(bar.Value); 

가도 있습니다

public string Foo(Bar! bar) 
+2

예 아니오 자신의 컴파일러/전처리기를 작성하십시오. C#을 AFAIK로 사용하면 ... 아니오 – Yahia

+2

'null'래퍼는 어떻게됩니까? – SLaks

답변

1

당신은 Value 속성을 통해 자체가 액세스 할 수있는 개체를 만들어 주조를 피할 수 있지만, 그 캐스팅보다 낫다 여부를 논쟁의 여지가있어 XML 또는 코드 주석을 통해이 값이 null이 아닌 ReSharper와 같은 도구를 알리는 데 사용할 수있는 비법 :

[NotNull] 
public T Value { get { return t; } }