ich eine Klasse (für die Zwecke dieser Frage vereinfacht), die einen decimal
Wert wickelt und verwendet ein paar implicit operator
Erklärungen für zwischen der Art und dem umhüllten Wert Umwandlung:Implizite Operatoren und ein Compilerfehler
private class DecimalWrapper
{
public decimal Value { get; private set; }
public DecimalWrapper(decimal value)
{
Value = value;
}
public static implicit operator decimal(DecimalWrapper a)
{
return a != null ? a.Value : default(decimal);
}
public static implicit operator DecimalWrapper(decimal value)
{
return new DecimalWrapper(value);
}
}
Die Verbräuche von implicit operator
hier erlauben Dinge wie diese zu tun:
DecimalWrapper d1 = 5; // uses implicit operator DecimalWrapper
DecimalWrapper d2 = 10;
var result = d1 * d2; // uses implicit operator decimal
Assert.IsTrue(result.Equals(50));
Assert.IsTrue(result == 50);
nun eine zweite Klasse betrachten (auch hier vereinfacht), die einen überladenen Konstruktor hat, die einenehmen 10 oder ein DecimalWrapper
:
private class Total
{
private readonly DecimalWrapper _total;
public Total(DecimalWrapper total)
{
_total = total;
}
public Total(decimal totalValue)
{
_total = totalValue;
}
}
ich erwarten zu können, wäre eine Instanz von Total
, indem in einem ganzzahligen Wert instanziiert, die in eine Dezimalzahl bekommen umgewandelt würden:
var total = new Total(5);
Doch diese Ergebnisse in einem Compiler-Fehler:
The call is ambiguous between the following methods or properties: 'Namespace.Total.Total(TypeTests.DecimalWrapper)' and 'Namespace.Total.Total(decimal)'
um dies zu beheben, müssen Sie die implicit operator decimal
oder geben Sie entfernen, dass der Wert.210 ist in der Tat ein decimal
:
var total = new Total(5m);
Das ist alles gut und schön, aber ich sehe nicht, warum die implicit operator decimal
relevant ist hier. Also, was ist los?
"wird nicht einmal ausgeführt, wenn das läuft" --- warum sollte es? Sie haben eine Dezimalzahl übergeben, so dass keine Umwandlung erforderlich ist - der Konstruktor 'Total (dezimal totalValue) 'entspricht genau diesem Wert. – zerkms
@zerkms - Ich habe meine Frage ein wenig geklärt –
Es ist relevant, weil es 'Total (DecimalWrapper Total)' Konstruktor und eine implizite Konvertierung 'Int -> Dezimal -> DecimalWrapper'.Der Compiler (nachdem er die genaue Signaturübereinstimmung nicht gefunden hat) überprüft, welche Konstruktoren er nach der Typkonvertierung erfüllen kann, und in diesem Fall ist es beides. – zerkms