Perché è così? Non è possibile che il compilatore elabori automaticamente che si deve intendere lo Bar
nidificato all'interno della stessa classe?
Beh, per prima cosa ci potrebbe essere potenzialmente altre classi nidificate chiamati Bar
all'interno di altre classi nello stesso spazio dei nomi, come segue:
namespace FooSpace
{
class Foo : List<Foo.Bar>
{
public class Bar { }
}
class Foo2 : List<Foo2.Bar>
{
public class Bar { }
}
}
Senza la qualificazione, che Bar
vuoi dire? Il compilatore non avrebbe avuto modo di dirlo. Quindi è molto più coerente per il compilatore non tentare di indovinare, ma per insistere su un nome di classe esplicitamente qualificato.
Per quanto riguarda il caso di attributo, anche se un attributo class-targeting è dichiarato sopra la dichiarazione della classe in questo modo:
[SomeAttr(typeof(Bar))]
class Foo { ...
in realtà, il compilatore traduce questo a qualcosa di più simile a questo:
class public auto ansi beforefieldinit FooSpace.Foo extends [mscorlib]System.Object
{
.custom instance void FooSpace.SomeAttr::.ctor ... etc.
In altre parole, l'oggetto dell'attributo viene creato all'interno della classe utilizzando il parametro fornito. Questo parametro typeof(Bar)
è ovviamente valido, poiché esiste nell'ambito di classe di Foo
.
La domanda correlata here discute anche questo caso.
E 'interessante notare che esattamente le stesse regole e comportamenti si applicano agli attributi di classe che accedono i membri della classe const o statici - non è necessario il specificare il nome della classe, perché l'attributo è effettivamente creato all'interno della classe.
La mia ipotesi sarebbe che il compilatore elabora gli attributi di classe dopo aver compilato le classi? Ma non conosco abbastanza i componenti interni del compilatore per sapere come trovare/provare quella risposta. Domanda molto interessante però! – BateTech
Qual è un esempio pratico di utilizzo di una classe figlio nidificata pubblica in questo modo? Perché avere una classe nidificata quando la classe genitore dipende dal figlio e basta renderla una classe nello stesso spazio dei nomi del genitore? – BateTech
@BateTech Ho trovato questa limitazione quando si lavora con un generatore di codice che mi consente solo di iniettare il codice all'interno di una classe, per definire i miei metodi. –