Ich habe eine Struktur:
%Vor%Und jetzt kann ich tun:
%Vor% Es scheint, dass der Compiler schlau genug ist, um Decibel
in double
zu konvertieren, und dann den Operator <
für Doppel zu verwenden?
Ich hatte eine andere struct
namens Duration
, die TimeSpan
umgab. Es hatte implizite Konvertierungen für TimeSpan
zu / from Duration
, aber die Operatoren <
und >
funktionieren nicht dafür.
Erkennt c # nur die Konvertierung zwischen primitiven Typen?
Beachten Sie zunächst, dass C # maximal eine implizite benutzerdefinierte Umwandlung zwischen Typen zulässt.
Wenn Sie also zwei Instanzen Decibel
vergleichen, sieht der Compiler, dass es eine benutzerdefinierte implizite Konvertierung konvertieren können ein Decibel
auf ein double
, mit denen die vergleichen.
Wenn Sie jedoch zwei Instanzen Duration
vergleichen, kann der Compiler keine finden Single implizite Konvertierung, die sie verwenden können, um den Vergleich zu ermöglichen. Der Compiler berücksichtigt keine benutzerdefinierten Vergleichsoperatoren für die Typen, auf die der Typ implizit konvertiert werden kann. Es wird nur nach integrierten Vergleichsoperatoren für die Typen gesucht, auf die der Typ implizit konvertiert werden kann.
Daher wird der Compiler nicht die implizite Konvertierung verwenden, um TimeSpan
, obwohl TimeSpan
liefert einen benutzerdefinierten Vergleichsoperator, die theoretisch verwendet werden könnte.
Beachten Sie auch, dass selbst wenn das TimeSpan
-Klasse eine implizite Umwandlung in double
, würde der Compiler noch nicht verwenden, da es nur höchstens eine implizite benutzerdefinierte Umwandlung in der Kette der impliziten Konvertierungen betrachten.
Mit anderen Worten, mit diesen Strukturen:
%Vor%Dieser Code wird kompiliert:
%Vor%Und natürlich wird dies:
%Vor%Aber das wird nicht:
%Vor% weil NumberWrapper
keine implizite Konvertierung in einen beliebigen Typ hat, der <
ohne weitere implizite Konvertierungen unterstützt.
, dass alle primitiven numerischen und Aufzählungstypen (zum Beispiel char, short, int, long, float, double, dezimal, Enum) bieten integrierte in Vergleichsoperatoren. Alle anderen Typen können nur benutzerdefinierte Vergleichsoperatoren bereitstellen.
Benutzerdefinierte Vergleichsoperatoren sehen so aus:
%Vor%Tags und Links c# implicit-conversion