私はこのようなサンプルの使用法を探しています:
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をnull許容型に自動ラップできます。
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をnull可能性をサポートするタイプに制約できれば、それで問題ありません。
それで、その後、Tをnull許容型に制約する方法はありますか?
いくつかの追加の注意事項:.NET 4.0、VS2010。そして、私はここでこれに似た質問を1つ見つけましたが、成功した答えはありませんでした。