C#中的"词法"类型参数范围

lep*_*pie 8 c# compiler-construction generics compiler-errors

我有2个场景.

这失败了:

class F<X>
{
  public X X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

错误CS0102:类型" F<X>"已经包含了一个定义," X"

这有效:

class F<X>
{
  class G
  {
    public X X { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

唯一合乎逻辑的解释是,在第二个片段中,类型参数X超出范围,这不是真的......

为什么类型参数会影响我在类型中的定义?

IMO,为了保持一致性,要么两者都应该有效,要么两者都不应该起

还有其他想法吗?

PS:我把它称为"词汇",但它可能不是正确的术语.

更新:

根据Henk的回答,这是一个显示相同行为的非通用版本,但可能更容易理解.

失败:

class F
{
  class X { }
  public X X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

作品:

class X { }
class F
{
  public X X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从我所看到的,C#编译器在类型定义边界创建一个词法范围.

它还意味着类型和成员名称位于相同的"位置"(或namespaceLISP).

Hen*_*man 3

G 类引入了独特的命名范围。如果省略默认规则,这两个版本将变为:

public F<X>.X F<X>.X { get; set; }    // error
public F<X>.X F<X>.G.X { get; set; }  // OK
Run Code Online (Sandbox Code Playgroud)