我正在寻找这样的示例用法:
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; }
}
这适用于基元,但不适用于String或其他类。
下一个 flavor 适用于字符串,但不适用于基元:
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。我确实在这里找到了与此类似的问题,但没有成功的答案。
最佳答案
您也许可以将Foo<T>
的构造函数设为内部,并要求只能通过工厂类创建新实例:
public class Foo<T>
{
private T value;
internal Foo(T value)
{
this.value = value;
}
public void Nullify()
{
this.value = default(T);
}
public T Value { get { return this.value; } }
}
public class Foo
{
public static Foo<T> Create<T>(T value) where T : class
{
return new Foo<T>(value);
}
public static Foo<T?> Create<T>(T? value) where T : struct
{
return new Foo<T?>(value);
}
}