我构建了一个包装类,旨在防止引用类型为null,作为前置条件代码契约。
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;
}
}
这很好用,但是在处理Nullable时总是需要强制转换:
public void Foo(NonNullable<Bar> bar)
{
Console.WriteLine((Bar)bar);
}
是否可以使NonNullable类型的参数表现得好像它是T类型,而不必抛出它? 就像Spec#:
一样public string Foo(Bar! bar)
答案 0 :(得分:1)
你可以通过Value
属性使对象本身可以访问来避免强制转换,但是它是否比强制转换它更有争议:
Console.WriteLine(bar.Value);
甚至有一些技巧可以通过XML或代码内注释告诉像ReSharper这样的工具,这个值不为null:
[NotNull]
public T Value { get { return t; } }