szukam użytkowania próbka coś takiego:Constrain generic być pustych type
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);
Biorąc pod uwagę to klasa Foo, mogę auto-wrap T do Nullable:
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; }
}
Działa to dla prymitywów, ale nie dla String lub innych klas.
Następny smak działa na smyczki, ale nie prymitywy:
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); }
}
mogę użyć Nullable<int>
dla foo2 a kod będzie działać tak:
Foo2<int?> intFoo = new Foo<int?>(42);
Ale ten jest podatny na błędy, ponieważ nie dla Foo2. Jeśli mógłbym ograniczyć T do typów, które wspierają zerowalność, to byłoby dobrze.
Więc po tym wszystkim, czy jest jakiś sposób, aby ograniczyć T, aby być typu pustych?
Niektóre dodatkowe uwagi: .NET 4.0, VS2010. I znalazłem tu jedno podobne pytanie, ale bez udanej odpowiedzi.
Interesujące. W prawdziwym życiu Foo jest bardziej skomplikowany i jest automatycznie tworzony przez framework. Będę musiał sprawdzić, czy istnieje sposób podpięcia/dostosowania sposobu, w jaki obiekty są tworzone, aby to podejście było wykonalne. – tcarvin
Zaakceptowany, ponieważ daje najmniejsze zaskoczenie klientowi wewnętrznemu biblioteki (czas projektowania/kompilacji w porównaniu z czasem wykonania). Ale test użyty przez @JonSkeet też był świetny! – tcarvin