667 Stimmen

Wie kann ich NULL von einer generischen Methode in C# zurückgeben?

Ich habe eine generische Methode mit diesem (Dummy) Code (ja ich bin bewusst, IList hat Prädikate, aber mein Code ist nicht mit IList, aber einige andere Sammlung, sowieso ist dies irrelevant für die Frage...)

    static T FindThing<T>(IList collection, int id) where T : IThing, new()
    {
        foreach T thing in collection
        {
            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 führt zu einem Fehler bei der Erstellung

"Kann nicht in den Typ-Parameter null konvertiert werden T' konvertiert werden, da er ein Wertetyp sein könnte. Erwägen Sie stattdessen die Verwendung von 'default(T)'."

Kann ich diesen Fehler vermeiden?

0 Stimmen

Wären nullbare Referenztypen (in C# 8) jetzt die bessere Lösung für dieses Problem? learn.microsoft.com/de-us/dotnet/csharp/nullable-references Rücksendung null unabhängig davon, ob T es Object o int o char .

0 Stimmen

Schade, dass T? in der Signatur funktioniert nicht. @Alexander-ReinstateMonica Ich habe den Artikel gelesen, konnte aber keine Möglichkeit sehen, zurückzukehren null unabhängig vom Referenz- oder Wertetyp.

1 Stimmen

@mireazma Das sind viel zu wenige Informationen, als dass ich helfen könnte. Sie sollten eine neue Frage eröffnen.

1161voto

Jon Skeet Punkte 1325502

Drei Optionen:

  • Rückkehr default (ou default(T) für ältere Versionen von C#), d.h. Sie erhalten null si T ist ein Referenztyp (oder ein nullbarer Werttyp), 0 para int , '\0' para char , usw. ( Tabelle der Standardwerte (C#-Referenz) )
  • Wenn Sie gerne einschränken möchten T zu einem Referenztyp mit der where T : class Zwang und dann zurück null wie gewohnt
  • Wenn Sie gerne einschränken möchten T zu einem nicht-nullbaren Werttyp mit der where T : struct Einschränkung, dann können Sie wiederum null wie üblich von einer Methode mit einem Rückgabewert von T? - beachten Sie, dass dies eine no eine Null-Referenz, sondern den Null-Wert des Typs "nullable value" zurück.

111voto

Ricardo Villamil Punkte 4924
return default(T);

49voto

TheSoftwareJedi Punkte 33452

Sie können einfach Ihre Beschränkungen anpassen:

where T : class

Dann ist die Rückgabe von null erlaubt.

17voto

Jaydeep Shil Punkte 1628

Nachfolgend finden Sie die beiden Optionen, die Sie verwenden können

return default(T);

o

where T : class, IThing
 return null;

15voto

Min Punkte 2985

Fügen Sie die Klassenbeschränkung als erste Beschränkung zu Ihrem generischen Typ hinzu.

static T FindThing<T>(IList collection, int id) where T : class, IThing, new()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X