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

时间:2010-05-13 08:32:37

标签: c# generics compiler-construction compiler-errors

我有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的回答,这是一个显示相同行为的非通用版本,但可能更容易理解。

失败:

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

使用:

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

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

这也意味着类型和成员名称位于相同的“位置”(或者就{LISP而言namespace)。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

X被定义为F范围内的类型。它类似于:

class F
{
  public void X();

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

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

F.X并未超出G范围,但这并不会阻止G定义新的X