Lei ha detto,
quando vi si accede da esempio, restituire la proprietà. Quando accedi in modo statico, restituisci la classe.
Ma cosa succede se dici solo Keys
da qualche parte dentro Material
? Si tratta di un accesso statico o di istanza? Si riferisce alla proprietà Keys
o al tipo nidificato Keys
? In realtà è ambiguo.
Per esempio,
class Material
{
class Keys
{
public static int Length;
}
string Keys { get; set; }
public void Process()
{
// Does this refer to string.Length (via property Keys)
// or Material.Keys.Length? It actually refers to both.
Console.WriteLine(Keys.Length);
}
}
Come sottolineato nei commenti, questa non è tutta la storia; ma quasi. È valido per avere una proprietà denominata Color
del tipo Color
e non c'è nessuno scontro:
public Color Color { get; set; }
Color.FromName(...) // refers to static method on the type ‘Color’
Color.ToString() // refers to instance method on the property’s value
Ma questo è facile da risolvere, semplicemente perché le cose nel campo di applicazione corrente conquistare le cose in ambiti più esterni:
public class MyType { public string FromName(string name) { return null; } }
public MyType Color;
Color.FromName(...) // unambiguously refers to MyType::FromName(string)
// via the property Color
Non è così semplice nell'esempio: la classe nidificata Keys
e la proprietà Keys
sono nello stesso ambito (hanno lo stesso tipo di dichiarazione). Come decidi quale dare la priorità? E anche se decidessi di dare una priorità a loro, questo sarebbe utile solo marginalmente perché potresti avere solo due cose con lo stesso nome, e una dovrebbe essere statica e l'altra.
Questo è lo scenario che vorrei vedere il lavoro. Ha perfettamente senso che io voglia dichiarare una classe interiore e dichiarare un membro di quel tipo nella classe esterna. La classe esterna contiene esattamente un'istanza di una cosa che definisce. Quella cosa non è progettata per funzionare in nessun altro contesto, quindi ha senso che sia la classe sia il membro si trovino nello stesso spazio dei nomi (ovvero la classe esterna è lo spazio dei nomi ... non la parola chiave dello spazio dei nomi C#). Per avere sia la classe che il membro nella stessa classe (esterna), devo nominarne uno in modo diverso.Ma quale voglio avere un nome strano? – steve