Welche impliziten Konvertierungen werden bei Verwendung von Operatoren unterstützt?

8

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?

    
zgnilec 29.04.2015, 08:54
quelle

1 Antwort

3

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.

Hinweis

, 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%     
Matthew Watson 29.04.2015, 09:26
quelle

Tags und Links