2

我已经构建了旨在防止引用类型为空的包装类,作为前置条件代码合同。

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)
4

1 回答 1

1

您可以通过使对象本身可以通过Value属性访问来避免强制转换,但是这是否比强制转换更好是有争议的:

Console.WriteLine(bar.Value);

您甚至可以使用一些技巧来告诉 ReSharper 等工具此值不为空,无论是通过 XML 还是代码内注释:

[NotNull]
public T Value { get { return t; } }
于 2011-10-09T16:10:54.317 回答