2016-06-14 8 views
5

Dieser Code funktioniert:Warum verursacht die Ausführung dieses Getter-Nullwerts einen Kompilierungsfehler?

class Example 
{ 
    public Int32 Int32 
    { 
     get { return Int32.Parse("3"); } 
    } 
} 

Dieser Code kompiliert nicht: 'int'

class Example 
{ 
    public Int32? Int32 
    { 
     get { return Int32.Parse("3"); } 
    } 
} 

CS1061 enthält keine Definition für 'Parse' und keine Erweiterungsmethode 'Parse', die ein erstes Argument vom Typ 'int?' gefunden werden konnte (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis?)


kann Mein Beispiel albern aussehen, aber es macht Sinn viel mehr, wenn Sie eine ENUM verwenden vorstellen, wie

public Choice? Choice { get { return Choice.One; } } 
+3

Im zweiten Beispiel bezieht sich 'Int32' auf die Eigenschaft' Int32' und nicht auf 'System.Int32'. – PetSerAl

Antwort

5

Mit Objekttyp Name die gleichen wie Eigenschaftsnamen zu sein, ist Sonderfall abgedeckt ist Spezifikation:

7.6.4.1 Identische einfache Namen und Typ Name
In einem Mitglied Zugriff der Form E.I, wenn E ist eine einzige Kennung, und wenn die Bedeutung von E als einfach Namen (§7.6.2) ist eine Konstante, Feld, Eigenschaft, lokale Variable oder Parameter mit dem gleichen Typ wie die Bedeutung E als Typenname (§3.8), dann sind beide möglichen Bedeutungen von E zulässig. Die zwei möglichen Bedeutungen von E.I sind niemals mehrdeutig, da I in beiden Fällen notwendigerweise ein Mitglied des Typs E sein muss. Mit anderen Worten, die Regel erlaubt einfach den Zugriff auf die statischen Member und verschachtelten Typen von E, wo sonst ein Fehler bei der Kompilierung aufgetreten wäre.

Also, in Ihrem ersten Schnipsel Int32 einfachen Namen Int32 sowie den Typ Int32 beziehen sich auf Eigentum erlaubt.

Im zweiten Snippet wird diese Regel nicht angewendet und der einfache Name Int32 bezieht sich nur auf die Eigenschaft.

+0

Ich bin immer noch nicht klar, warum im ersten Fall es nicht auf die Eigenschaft bezieht, aber im zweiten Fall ist es. – ehh

+1

@ehh Denken Sie, wenn der Rückgabetyp "Objekt" anstelle von "Int32" wäre. Dann würde "Int32" eindeutig nur auf die Eigenschaft und nicht auf den Typ verweisen. Der Nullable-Typ ist etwas subtiler, aber es ist immer noch ein anderer Typ, so dass der Spezialfall nicht zutrifft. –

+0

Große Antwort! Alles klar jetzt für mich zumindest – Mafii

7

Im zweiten Beispiel bezieht sich Int32 auf Eigenschaft Int32 nicht auf System.Int32. Und da die Eigenschaft Int32 vom Typ System.Nullable(System.Int32) ist, hat sie keine Parse-Methode.

Sie werden schreiben,

public Int32? Int32 
{ 
    get { return System.Int32.Parse("3"); } 
} 
+1

Ich glaube nicht, das erklärt, warum es funktioniert, wenn es nicht Nullable ist ... –

+1

Wenn es nicht Nullable ist, ist die Eigenschaft 'Int32' vom Typ' System.Int32', die eine Parse-Methode hat. –

+1

@ default.kramer Wenn der Name des Eigenschaftstyps mit dem Namen der Eigenschaft identisch ist, handelt es sich um einen speziellen Fall, der in der Spezifikation behandelt wird. In diesem Fall bezieht sich "Int32" auf die Eigenschaft und gibt sie gleichzeitig ein. – PetSerAl

Verwandte Themen