2016-06-14 19 views
5

Questo codice funziona:Perché rendere questo getter annullabile causa un errore di compilazione?

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

Questo codice non può essere compilato: 'int'

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

CS1061 non contiene una definizione per 'Parse' e nessun metodo di estensione 'Parse' che accetta un primo argomento di tipo 'int?' potrebbe essere trovato (le manca un un riferimento all'assembly direttiva using o?)


Il mio esempio può sembrare stupido, ma rende molto più senso se si utilizza immaginare un enum, come

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

Nel secondo esempio, 'Int32' si riferisce alla proprietà' Int32' per non digitare 'System.Int32'. – PetSerAl

risposta

5

Avere nome del tipo di proprietà di essere lo stesso nome di proprietà è caso speciale coperta si specifica:

7.6.4.1 semplici nomi identici e tipo nomi
In un accesso membri della forma E.I, se E è un identificatore unico, e se il significato di E come un semplice nome(§7.6.2) è un costante, campo, proprietà, variabile locale o parametro con lo stesso tipo del significato di E come nome-tipo (§3.8), quindi sono consentiti entrambi i significati possibili di E. I due possibili significati di E.I non sono mai ambigui, poiché I deve necessariamente essere un membro del tipo E in entrambi i casi. In altre parole, la regola consente semplicemente l'accesso ai membri statici e ai tipi nidificati di E dove si sarebbe verificato un errore in fase di compilazione.

Quindi, nel tuo primo frammento di nome semplice Int32 permesso di fare riferimento alla proprietà Int32 così come a digitare Int32.

Nel secondo frammento questa regola non viene applicata e il nome semplice Int32 si riferisce solo alla proprietà.

+0

Non sono ancora chiaro perché nel primo caso, non si riferisce alla proprietà ma nel secondo caso lo è. – ehh

+1

@ehh Pensa se il tipo di ritorno fosse 'object' invece di' Int32'. Quindi "Int32" farebbe chiaramente riferimento alla proprietà solo e non al tipo. Il tipo nullable è leggermente più sottile, ma è ancora un tipo diverso, quindi il caso speciale non si applica. –

+0

Ottima risposta! Tutto chiaro ora per me almeno – Mafii

7

Nel secondo esempio Int32 si riferisce alla proprietà Int32 non digitare System.Int32. E poiché la proprietà Int32 è di tipo System.Nullable(System.Int32), non ha un metodo di analisi.

Dovrete scrivere,

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

Non penso che questo spieghi perché funziona quando non è annullabile ... –

+1

Quando non è annullabile, la proprietà 'Int32' è di tipo' System.Int32', che ha un metodo di analisi. –

+1

@ default.kramer Il nome del tipo di proprietà è uguale al nome della proprietà è un caso speciale coperto nelle specifiche. In questo caso, 'Int32' si riferisce alla proprietà e digita nello stesso tempo. – PetSerAl

Problemi correlati