Я ищу использование образца что-то вроде этого:Constrain родовых быть обнуляемым Типу
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 типами, которые поддерживают nullability, тогда это будет хорошо.
Итак, есть ли способ ограничить T типом NULL?
Некоторые дополнительные примечания: .NET 4.0, VS2010. И я нашел здесь один подобный вопрос, но без успешного ответа.
Интересно. В реальной жизни Foo более сложный и автоматически создается каркасом. Мне нужно посмотреть, есть ли способ подключить/настроить способ создания объектов, чтобы сделать этот подход выполнимым. – tcarvin
Принято, так как это дает наименьший сюрприз внутреннему клиенту библиотеки (время разработки/компиляции и время выполнения). Но тест, использованный @JonSkeet, тоже был отличным! – tcarvin