私はこのようなサンプルの使用法を探しています:
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つ見つけましたが、成功した答えはありませんでした。