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?
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.