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
risposta
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.
@Jon: come funzionerebbe un'implementazione non statica? Quale istanza della classe del metodo di estensione utilizzerebbe una chiamata? –
Sono con Adam, se non fosse statico come si determinerebbe l'istanza specifica da chiamare? Cosa significherebbe se ci fossero diverse istanze? –
@Adam: non stavo suggerendo che un metodo non statico avrebbe avuto senso. Stavo suggerendo un tipo * non statico * avrebbe senso. –
- 1. Metodi di estensione vs utilità statica Classe
- 2. Come definire i metodi di estensione per la classe generica?
- 3. C++ Inoltro enunciato classe dichiarante
- 4. Perché è impossibile dichiarare i metodi di estensione in una classe statica generica?
- 5. metodi di estensione statici
- 6. I metodi di estensione nascondono le dipendenze?
- 7. Posso aggiungere metodi (statica) di classe che utilizzano EmberJS mixins
- 8. I metodi LINQ sono metodi di estensione?
- 9. metodo di estensione per estendere la classe statica
- 10. È accettabile utilizzare i metodi di estensione su una classe che è possibile modificare
- 11. Intellisense per i metodi di estensione?
- 12. Estensione di Protobuf con i miei metodi
- 13. Aggiungi eventi utilizzando i metodi di estensione
- 14. Metodi di estensione virtuale?
- 15. Funzione di estensione statica su una classe Java
- 16. scons costruisce sia la libreria statica che quella condivisa
- 17. Come vengono compilati i metodi di estensione?
- 18. metodi statici di estensione che supportano vincoli membri
- 19. Come organizzare i metodi di estensione di Kotlin
- 20. Perché C# e Java richiedono che tutto sia in una classe?
- 21. È possibile aggiungere la funzione di estensione "statica" per la classe Java?
- 22. C#: operatore implicita e Metodi di estensione
- 23. I metodi di estensione possono essere applicati alle interfacce?
- 24. Utilizzando metodi di estensione all'interno classe estesa si
- 25. C# utilizzando i parametri e i metodi di estensione
- 26. Best practice: C# Spazio dei nomi dei metodi di estensione e promozione dei metodi di estensione
- 27. Sia @Component che @Named per la stessa classe di bean
- 28. Metodi di estensione C# visibili e accessibili solo all'interno di una classe ("privata")
- 29. Estensione di Chrome modificata - chrome crede che sia un malware
- 30. Usa la classe statica per interfaccia?
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