Ich habe eine generische Methode mit diesem (Dummy-) Code (ja, ich weiß, dass IList Prädikate hat, aber mein Code verwendet nicht IList, sondern eine andere Sammlung, dies ist jedoch für die Frage irrelevant ...)
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.
}
Dies gibt mir einen Build-Fehler
"Null kann nicht in den Typparameter 'T' konvertiert werden, da es sich um einen Werttyp handeln kann. Verwenden Sie stattdessen 'default (T)'."
Kann ich diesen Fehler vermeiden?
null
unabhängig davon , obT
istObject
oderint
oderchar
.Antworten:
Zwei Optionen:
default(T)
was bedeutet, dass Sie zurückkehren,null
wenn T ein Referenztyp (oder ein nullwertfähiger Werttyp)0
fürint
,'\0'
fürchar
usw. ist ( Standardwertetabelle (C # -Referenz) )where T : class
Einschränkung und kehren Sie dannnull
wie gewohnt zurückquelle
Nullable<int>
oderNullable<DateTime>
stattdessen konvertieren . Wenn Sie einen nicht nullbaren Typ verwenden und einen Nullwert darstellen müssen, fragen Sie nur nach Problemen.quelle
Sie können einfach Ihre Einschränkungen anpassen:
Dann ist die Rückgabe von null zulässig.
quelle
IDisposable
. Ja, meistens muss es nicht sein.System.String
implementiertIDisposable
zum Beispiel nicht. Der Antwortende hätte das klarstellen sollen, aber das macht die Antwort nicht falsch. :)Fügen Sie die Klasseneinschränkung als erste Einschränkung zu Ihrem generischen Typ hinzu.
quelle
Wenn Sie ein Objekt haben, müssen Sie es typisieren
wenn Sie null zurückgeben müssen.
quelle
Nachfolgend sind die beiden Optionen aufgeführt, die Sie verwenden können
oder
quelle
Sie können dies auch am Ende Ihrer Erklärung hinzufügen:
Auf diese Weise können Sie null zurückgeben.
quelle
where T : class, IList
. Wenn Sie Einschränkungen für verschiedene Typen haben, wiederholen Sie das Tokenwhere
wie inwhere TFoo : class where TBar : IList
.Lösung von TheSoftwareJedi funktioniert,
Sie können es auch mit einigen wert- und nullbaren Typen archivieren:
quelle
Nehmen Sie die Empfehlung des Fehlers ... und entweder Benutzer
default(T)
odernew T
.Sie müssen einen Vergleich in Ihren Code einfügen, um sicherzustellen, dass es sich um eine gültige Übereinstimmung handelt, wenn Sie diesen Weg gehen.
Andernfalls sollten Sie möglicherweise einen Ausgabeparameter für "Übereinstimmung gefunden" in Betracht ziehen.
quelle
Hier ist ein Arbeitsbeispiel für Nullable Enum-Rückgabewerte:
quelle
where TEnum : struct, Enum
. Dies stellt sicher, dass ein Anrufer nicht versehentlich einen Werttyp angibt, der keine Aufzählung ist (z. B. einint
oder einDateTime
).Eine weitere Alternative zu 2 oben dargestellten Antworten. Wenn Sie Ihren Rückgabetyp in ändern
object
, können Sie zurückgebennull
und gleichzeitig die Nicht-Null-Rückgabe umwandeln.quelle
Der Vollständigkeit halber ist es gut zu wissen, dass Sie dies auch tun können:
Es gibt dasselbe zurück wie
return default(T);
quelle
Für mich funktioniert es so wie es ist. Wo genau liegt das Problem?
quelle