У меня есть 2 сценария.
Это перестало работать:
class F<X>
{
public X X { get; set; }
}
ошибка CS0102: тип'F<X>
'уже содержит определение для'X
'
Это работает:
class F<X>
{
class G
{
public X X { get; set; }
}
}
Единственное логическое объяснение состоит в том, что во втором отрывке параметр типа X вне объема, который не верен...
Почему параметр типа должен влиять на мои определения в типе?
IMO, для непротиворечивости, или оба должны работать, или ни один не должен работать.
Какие-либо другие идеи?
PS: Я называю это 'лексическим', но это - вероятно, не правильный термин.
Обновление:
Согласно ответу Henk, вот неуниверсальная версия, отображающая то же поведение, но возможно легче к grok.
Сбои:
class F
{
class X { }
public X X { get; set; }
}
Работы:
class X { }
class F
{
public X X { get; set; }
}
Из того, что я вижу, компилятор C# создает лексический контекст на границах определения типа.
Это также подразумевает, что типы и имена элемента живут в том же 'месте' (или namespace
с точки зрения LISP).
Класс G вводит отличительную область именования. Если опустить правила по умолчанию, то 2 версии выглядят так:
public F<X>.X F<X>.X { get; set; } // error
public F<X>.X F<X>.G.X { get; set; } // OK
X
определяется как тип в области F
. Это похоже на следующее:
class F
{
public void X();
public int X(); // Bad, trying to redefine X.
class G
{
public string X(); // OK, different scope
}
}
FX
не выходит за рамки G
, но это не мешает G
определять новый X
.