2010-04-28 8 views
19

Perché i metodi di estensione richiedono che la classe dichiarante sia statica? È un requisito del compilatore?I metodi di estensione richiedono che la classe dichiarante sia statica

+0

possibile duplicato di [Perché i metodi di estensione sono consentiti solo in classi statiche non nidificate e non generiche?] (Http://stackoverflow.com/questions/3930335/why-are-extension-methods-only-allowed- in-non-nested-non-generic-static-class) – nawfal

risposta

26

E 'dettato nella specifica del linguaggio, la sezione 10.6.9 del C# 4 spec:

Quando il primo parametro di un metodo comprende il questo modificatore, che metodo si dice che sia un prolungamento metodo. I metodi di estensione possono essere solo dichiarati in classi statiche non generiche, non nidificate . Il primo parametro di un metodo di estensione non può avere modificatori diversi da questo e il tipo di parametro non può essere un puntatore tipo .

Non è chiaro perché tutte di queste restrizioni sono necessarie - diversi da quelli potenzialmente per il compilatore (e spec lingua) semplicità. Posso capire perché ha senso limitarlo a tipi non generici, ma non riesco a capire immediatamente perché debbano essere non nidificati e statici. Sospetto che le regole di ricerca siano notevolmente più semplici se non ti devi preoccupare dei tipi contenuti nel tipo corrente ecc., Ma oserei dire che sarebbe possibile.

Sospetto che la complessità extra di non avere queste restrizioni sia stata considerata inferiore al beneficio ottenuto. EDIT: Per essere chiari, non sto suggerendo che avrebbe senso avere metodi di istanza come metodi di estensione - sto suggerendo che avrebbe senso avere un metodo di estensione statica in un nidificato e/o classe non statica.

+2

@Jon: come funzionerebbe un'implementazione non statica? Quale istanza della classe del metodo di estensione utilizzerebbe una chiamata? –

+0

Sono con Adam, se non fosse statico come si determinerebbe l'istanza specifica da chiamare? Cosa significherebbe se ci fossero diverse istanze? –

+2

@Adam: non stavo suggerendo che un metodo non statico avrebbe avuto senso. Stavo suggerendo un tipo * non statico * avrebbe senso. –

Problemi correlati