Mam ogólną metodę z tym (obojętnym) kodem (tak, wiem, że IList ma predykaty, ale mój kod nie używa IList, ale innej kolekcji, w każdym razie nie ma to znaczenia dla pytania ...)
static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}
Daje mi to błąd kompilacji
„Nie można przekonwertować wartości null na parametr„ T ”, ponieważ może to być typ wartości. Rozważ użycie zamiast tego parametru„ default (T) ”.”
Czy mogę uniknąć tego błędu?
null
bez względu naT
to, czy jestObject
lubint
czychar
.Odpowiedzi:
Dwie opcje:
default(T)
co oznacza, że zwrócisz,null
jeśli T jest typem odniesienia (lub typem wartości zerowej),0
forint
,'\0'
forchar
itp. ( Tabela wartości domyślnych (odniesienie C #) )where T : class
ograniczeniem, a następnie wróćnull
normalnieźródło
Nullable<int>
lubNullable<DateTime>
zamiast tego. Jeśli używasz typu, który nie ma wartości zerowej, i chcesz przedstawić wartość zerową, po prostu prosisz o kłopoty.źródło
Możesz po prostu dostosować swoje ograniczenia:
Wówczas dozwolone jest zwracanie wartości null.
źródło
IDisposable
. Tak, przez większość czasu tak nie musi być. na przykładSystem.String
nie implementujeIDisposable
. Odpowiadający powinien to wyjaśnić, ale to nie czyni odpowiedzi błędną. :)Dodaj ograniczenie klasy jako pierwsze ograniczenie do typu ogólnego.
źródło
Jeśli masz obiekt, musisz rzutować czcionką
jeśli musisz zwrócić null.
źródło
Poniżej znajdują się dwie opcje, których możesz użyć
lub
źródło
Inną opcją byłoby dodanie tego na końcu deklaracji:
W ten sposób pozwoli ci zwrócić wartość null.
źródło
where T : class, IList
. Jeśli masz ograniczenia do różnych typów, powtórz tokenwhere
, jak wwhere TFoo : class where TBar : IList
.rozwiązanie prac TheSoftwareJedi,
możesz także zarchiwizować go, używając kilku typów wartości i dopuszczających wartości zerowe:
źródło
Weź zalecenie błędu ... i albo użytkownika
default(T)
albonew T
.Musisz dodać porównanie w kodzie, aby upewnić się, że było to prawidłowe dopasowanie, jeśli wybierzesz tę trasę.
W przeciwnym razie potencjalnie rozważ parametr wyjściowy dla „znaleziono dopasowanie”.
źródło
Oto działający przykład zwracanych wartości Nullable Enum:
źródło
where TEnum : struct, Enum
. Zapewnia to, że osoba dzwoniąca nie poda przypadkowo typu wartości, który nie jest wyliczeniem (takim jak aint
lub aDateTime
).Kolejna alternatywa dla 2 odpowiedzi przedstawionych powyżej. Jeśli zmienisz typ zwrotu na
object
, możesz wrócićnull
, jednocześnie rzucając zwrot inny niż null.źródło
Dla kompletności dobrze jest wiedzieć, że możesz to zrobić również:
Zwraca to samo co
return default(T);
źródło
Dla mnie to działa tak, jak jest. Gdzie dokładnie jest problem?
źródło