'Лексический' обзор параметров типа в C#

У меня есть 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).

8
задан leppie 13 May 2010 в 09:09
поделиться

2 ответа

Класс G вводит отличительную область именования. Если опустить правила по умолчанию, то 2 версии выглядят так:

public F<X>.X F<X>.X { get; set; }    // error
public F<X>.X F<X>.G.X { get; set; }  // OK
3
ответ дан 5 December 2019 в 23:14
поделиться

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 .

2
ответ дан 5 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: