Cześć,
Jeżeli oryginalna treść zadania wyglądała tak:
public static T GetObjectOrNull<T>(bool getNull)
{
if (getNull) return null;
else return new T();
}
to rozwiązaniem problemu jest dodanie ograniczeń typu generycznego w taki sposób:
public static T GetObjectOrNull<T>(bool getNull) where T:class,new()
{
if (getNull) return null;
else return new T();
}
Dlaczego ?
Po pierwsze typ <T> może być dowolnym typem, a to oznacza, że może być też typem wartościowym (np. integer), który nie może przyjmować wartości null, dlatego kompilator widzi błąd dla 'return null'. Żeby temu zapobiec możemy ograniczyć typy generyczne wyłącznie do typów referencyjnych używając 'where T:class'.
Po drugie typ <T> jako dowolny typ, może posiadać prywatny konstruktor co powoduje, że próba utworzenia instancji typu <T> zakończy się niepowodzeniem (bo nie widzimy konstruktora i nie możemy wykonać 'new T()' ). Rozwiązaniem tego problemu jest użycie dodatkowo 'where T:new()', co ogranicza typy generyczne do takich, które posiadają publiczny bezparametrowy konstruktor.
Warto przeczytać ten tekst.
Pozdrawiam aeragram