2015-01-14 14 views
7

Sto esaminando la grammatica di C# 5.0 e non capisco perfettamente l'uso di "base". Nel manuale di riferimento, v'è una nozione di "accesso base" definito come:C# grammatica "base"

base-access: 
    base . identifier 
    base [ expression-list ] 

Dove base è una parola chiave, e sembra che questo è l'unico caso. Tuttavia, trovo ingressi C# come

base.WithAdditionalDiagnostics<TNode>(node, diagnostics); 

Qualcuno può indicarmi quale regola di grammatica si riferisce a questa affermazione? Poiché "base" sembra essere una normale parola chiave, non contestuale, presumo che in questo caso sia necessaria una regola grammaticale specifica e che base non possa essere semplicemente un identificatore.

+0

Non posso indicarti una specifica regola di grammatica, ma posso dirti che 'base' è usato per riferirsi a una classe da cui ne deriva un'altra. Viene generalmente utilizzato quando si esegue l'override di un metodo o di un costruttore per accedere allo stato o al comportamento della super classe. –

+1

Potrebbe essere utile fornire un collegamento al manuale di riferimento C# 5.0 – Justin

+1

Non sono sicuro di aver compreso la tua domanda. Non sono sicuro di come interpretare "sembra che questo sia l'unico caso" né "quale regola grammaticale si riferisce a questa affermazione" (dato che * più regole grammaticali * saranno coinvolte nell'interpretazione di ogni particolare affermazione) –

risposta

11

Credo che dovrebbe effettivamente essere

base-access: 
    base . identifier type-argument-list_opt 
    base [ expression-list ] 

... che renderebbe proprio come membro-accesso:

member-access: 
    primary-expression . identifier type-argument-list_opt 
    predefined-type . identifier type-argument-list_opt 
    qualified-alias-member . identifier type-argument-list_opt 

In altre parole, in un'espressione

base.WithAdditionalDiagnostics<TNode>(node, diagnostics); 

solo

base.WithAdditionalDiagnostics<TNode> 

è il base-accesso parte - e il resto viene analizzato come sarebbe per altre chiamate come x.WithAdditionalDiagnostics<TNode>(node, diagnostics).

Dalla sezione 7.6.8 del C# 5 spec:

Al vincolante in tempo, base-accesso espressioni della forma base.I e base[E] sono valutate esattamente come se fossero scritte ((B)this).I e ((B)this)[E], dove B è la classe base della classe o della struttura in cui si verifica il costrutto. Pertanto, base.I e base[E] corrispondono a this.I e this[E], eccetto this è visualizzato come un'istanza della classe base.

Senza l'ulteriore tipo-argument-list opt però, credo che la tua espressione esistente non sarebbe analizzare.

Questo è effettivamente specificato correttamente nello 4th edition of the ECMA-334 specification; Lo farò come un bug con la specifica C# (e assicurarmi che non si rompa per la 5a edizione).

+0

Sembra che ci siano riferimenti a più versioni differenti della specifica. Quello che ho di fronte a me di C# 5 definisce le regole grammaticali come questa: * base-access: base. identificatore base [argomento-lista] *. http://i.imgur.com/iuScjTQ.png –

+2

@JeroenVannevel: No, è la stessa specifica che ho - sto dicendo che c'è un bug nella prima opzione lì. –

+1

Ah, ho pensato che stavi correggendo l'OP. Ha senso allora. –