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).
Nie widzę powodu, dla którego pierwszy nie powinien działać, każdy, kto jest w stanie odtworzyć błąd kompilatora? –
@Ori: Po prostu spróbuj. :) – leppie
Według twojej aktualizacji wygląda na to, że Marcelo odpowiedział na Twoje pytanie - zademonstrował to samo. – Kobi