2012-05-09 3 views
6

Wenn wir zwei Strukturen haben, und eine implizit in die andere konvertierbar ist, dann scheint es, dass die System.Nullable<> Versionen der beiden auch implizit konvertierbar sind. Wenn die Struktur A eine implizite Konvertierung in die Struktur B hat, wird A? ebenfalls in B? konvertiert. Hier"Covariance" der System.Nullable <> Struktur

ein Beispiel:

struct MyNumber 
{ 
    public readonly int Inner; 

    public MyNumber(int i) 
    { 
    Inner = i; 
    } 

    public static implicit operator int(MyNumber n) 
    { 
    return n.Inner; 
    } 
} 

Innerhalb einiger Methode:

MyNumber? nmn = new MyNumber(42); 
int? covariantMagic = nmn; // works! 

In der C# Language Specification Version 4.0 lesen wir, dass eine Umwandlung wie dies gilt für „die vordefinierte implizite Identität existieren und numerische Konvertierungen ".

Aber ist es sicher anzunehmen, dass es auch für benutzerdefinierte implizite Konvertierungen funktioniert?

(könnte diese Frage zu diesem Fehler in Beziehung gesetzt werden: http://connect.microsoft.com/VisualStudio/feedback/details/642227/)

Antwort

6

Aber ist es sicher davon ausgehen, dass es funktioniert auch für implizite Konvertierungen benutzerdefinierte?

Ja. Aus Abschnitt 6.4.2 der C# 4 spec:

ein benutzerdefinierter Umwandlungsoperator Da die von einem nicht-NULL festlegbare Werttyp S zu einem nicht-NULL festlegbare Werttyp convers T ein angehoben Umwandlungsoperator existiert das konvertiert von S? zu T?. Dies hob Umwandlungsoperator führt von S? zu S vom Benutzer definierte Umwandlung von ST zu, gefolgt von einer Umhüllung aus T bis T?, mit der Ausnahme, dass ein Null-wertige S? wandelt direkt auf ein Null-wertige T? folgte ein Auswickeln.

Ein aufgehobener Konvertierungsoperator hat die gleiche implizite oder explizite Klassifizierung wie sein zugrunde liegender benutzerdefinierter Konvertierungsoperator. Der Begriff "benutzerdefinierte Konvertierung" bezieht sich sowohl auf die Verwendung benutzerdefinierter als auch auf hochgestufter Konvertierungsoperatoren.

+4

Haben Sie noch Zeit, diese Zitate zu sehen oder geben Sie sie einfach von Hand ein? – Blindy

+0

@Blindy: Beides! Ich habe eine Kopie der Spezifikation auf meinem Schreibtisch, und ich habe diesen Abschnitt kopiert, indem ich tippte ... daher Tippfehler! –

+0

Hmm, ich habe Abschnitt 6.4.2 verpasst und nur 6.1.4 gelesen. Vielen Dank. –

Verwandte Themen