我在尋找樣品使用這樣的事情:約束一般是空類型
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,我可以自動換行牛逼到一個可空:
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或其他類。
下一頁味適用於字符串,但不是基本類型:
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); }
}
我可以用Nullable<int>
爲foo2的,代碼將工作是這樣的:
Foo2<int?> intFoo = new Foo<int?>(42);
但是,這是很容易出錯,因爲它失敗爲Foo2。如果我可以將T約束爲支持可空性的類型,那就沒問題了。
所以,所有這一切,有什麼辦法來約束T爲可空類型?
一些附加說明:.NET 4.0,VS2010。我在這裏找到了一個類似的問題,但沒有成功的答案。
有趣。在現實生活中,Foo更復雜,並且由框架自動創建。我需要看看是否有方法鉤住/定製創建對象的方式,以使這種方法可行。 – tcarvin 2013-02-15 14:15:59
接受,因爲它對庫的內部客戶(設計/編譯時與運行時間)給予最少的驚喜。但@JonSkeet使用的測試也很棒! – tcarvin 2013-02-20 13:30:04