在C#中自动转换包装器

时间:2011-10-09 15:58:04

标签: c# wrapper non-nullable preconditions

我构建了一个包装类,旨在防止引用类型为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)

1 个答案:

答案 0 :(得分:1)

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

Console.WriteLine(bar.Value);

甚至有一些技巧可以通过XML或代码内注释告诉像ReSharper这样的工具,这个值不为null:

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