Der Vergleich eines generischen Typs mit seinem Standardwert ohne generische Klasseneinschränkung ergibt einen Kompilierzeitfehler

8

Ich bin gerade in diese Situation geraten und dachte, es wäre eine gute Gelegenheit, das Standard-Keyword zu verwenden. Aber es kompiliert nicht, und ich kann nicht warum denken. Das folgende Beispiel veranschaulicht mein Problem:

%Vor%

Sie erhalten einen Fehler in Zeile 8 ("Operator '==' kann nicht auf Operanden vom Typ 'TDataSource' und 'TDataSource' angewendet werden."). Ich dachte, die Verwendung des Standardschlüsselworts würde Vergleichsprobleme zwischen Referenztypen und Werttypen beseitigen.

Durch Hinzufügen einer generischen Einschränkung, die TDataSource auf Referenztypen beschränkt, wird dieses Codeteil kompiliert.

Kann jemand erklären, warum der Compiler das nicht für mich repariert? Ist es nicht schlau genug zu sehen, dass das funktioniert?

Das hängt zusammen: Kann nicht operator == auf generische Typen in C # angewendet werden?

[Bearbeiten] SLaks Antwort gab mir einige Inspiration, der '==' Operator wird nicht funktionieren, aber die Equals Funktion sollte.

%Vor%

Dies kompiliert würde diese Funktion richtig?

    
JJoos 03.09.2010, 13:29
quelle

1 Antwort

5

Sie können nicht davon ausgehen, dass jeder Werttyp den Operator == überschreibt. (Und selbst wenn sie es tun würden, gäbe es keine Möglichkeit, es Generika zu nennen; es ist eine statische Methode)

Stattdessen sollten Sie

schreiben %Vor%

Wenn result ist null (und ein Referenztyp), der ReferenceEquals Aufruf gibt true zurück, so dass Equals nicht aufgerufen wird und keine NullReferenceException .
Wenn TDataSource ein Werttyp ist, vergleicht ReferenceEquals zwei verschiedene eingerahmte Referenzen (die möglicherweise den gleichen Wert enthalten, aber immer noch unterschiedlich sind), sodass sie an den Equals -Aufruf weitergeleitet werden.

    
SLaks 03.09.2010, 13:31
quelle

Tags und Links