2010-05-13 11 views
8

Mam 2 scenariusze.Określenie zakresu "leksykalnego" w C#

ta zawodzi:

class F<X> 
{ 
    public X X { get; set; } 
} 

błędzie CS0102: typu 'F<X>' już zawiera definicję dla 'X'

to działa:

class F<X> 
{ 
    class G 
    { 
    public X X { get; set; } 
    } 
} 

jedyne logiczne wyjaśnienie jest to, że w drugim fragmencie parametr typu X jest poza zakresem, co nie jest prawdą.

Dlaczego parametr typu powinien wpływać na moje definicje w typie?

IMO, w celu zachowania spójności oba powinny działać, a żadne nie powinno działać.

Jakieś inne pomysły?

PS: Nazywam to "leksykalnym", ale prawdopodobnie nie jest to poprawne określenie.

Aktualizacja:

Jak na odpowiedź Henksa, tutaj jest non-generic version wyświetla ten sam problem, ale być może łatwiej grok.

zawodzi:

class F 
{ 
    class X { } 
    public X X { get; set; } 
} 

działa:

class X { } 
class F 
{ 
    public X X { get; set; } 
} 

Z tego co widzę, C# kompilator tworzy zakres leksykalny na typ boundries definition.

Oznacza to również, że typy i nazwy członków żyją w tej samej "lokalizacji" (lub namespace pod względem LISP).

+0

Nie widzę powodu, dla którego pierwszy nie powinien działać, każdy, kto jest w stanie odtworzyć błąd kompilatora? –

+0

@Ori: Po prostu spróbuj. :) – leppie

+0

Według twojej aktualizacji wygląda na to, że Marcelo odpowiedział na Twoje pytanie - zademonstrował to samo. – Kobi

Odpowiedz

3

Klasa G wprowadza charakterystyczny zakres nazw. Jeśli pominąć domyślne reguły, 2 wersje stają się:

public F<X>.X F<X>.X { get; set; } // error 
public F<X>.X F<X>.G.X { get; set; } // OK 
+0

Dzięki, że wydaje się mieć trochę sensu :) I dlaczego: klasa F { klasa X {} public X X; get; zestaw; } } również nie działa. – leppie

2

X jest zdefiniowany jako typ w zakresie F. Jest on podobny do tego:

class F 
{ 
    public void X(); 

    public int X(); // Bad, trying to redefine X. 

    class G 
    { 
    public string X(); // OK, different scope 
    } 
} 

F.X nie jest poza zakresem w G, ale to nie powstrzymuje G od zdefiniowania nowego X.

+0

Niestety, twój X jest członkiem, mój jest parametrem typu. Mogę to zrozumieć. – leppie

+0

Przepraszam za rozwagę, @leppie. Czy zgadzasz się ze mną lub nie zgadzasz? –

+0

Nie zgadzam się. :) – leppie

Powiązane problemy