我正在寻找这样的示例用法:

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);
    }
}

08-05 06:25