我正在寻找类似以下用法的示例:
Foo<string> stringFoo = new Foo<string>("The answer is");
Foo<int> intFoo = new Foo<int>(42);
// The Value of intFoo & stringFoo are strongly typed
stringFoo.Nullify();
intFoo.Nullify();
if (stringFoo == null && intFoo == null)
MessageBox.Show("Both are null);
考虑到这个类Foo,我可以自动将T包装成可空类型:
public class Foo1<T>
where T : struct
{
private T? _value;
public Foo(T? initValue)
{
_value = initValue;
}
public T? Value { get { return _value; } }
public void Nullify { _value = null; }
}
这适用于原始类型,但不适用于字符串或其他类。
下一个版本适用于字符串,但不适用于原始类型:
public class Foo2<T>
{
private T _value;
public Foo(T initValue)
{
_value = initValue;
}
public T Value { get { return _value; } }
public void Nullify { _value = default(T); }
}
我可以在Foo2中使用Nullable<int>
,代码将按如下方式工作:
Foo2<int?> intFoo = new Foo<int?>(42);
但这种方法容易出错,因为它无法处理Foo2。如果我能限制T为支持可空性的类型,那就没问题了。
所以经过所有这些,有没有办法限制T为可为空类型?
一些额外的注意事项:.NET 4.0,VS2010。我在这里找到了一个类似的问题,但没有成功的答案。
int?
确实有效,因为对于可空类型参数,空值检查会“做正确的事情”。 - Jon SkeetNullable<T>
是一个结构体。 - Lee