为什么泛型类型参数与其他成员之间存在名称冲突

Phi*_*p C 10 c# generics

有时候,有一些东西是有用的:

class X {
  ...
}

class Y {
  X X {
    get { ... }
    set { ... }
  }
}
Run Code Online (Sandbox Code Playgroud)

因为X描述了类型是什么(作为类名),以及被访问/变异的值(作为属性名称).到现在为止还挺好.假设您想要做同样的事情,但是以通用的方式:

class Z<T> {
  T T {
    get { ... }
    set { ... }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于此示例,编译器抱怨:The type 'Z<T>' already contains a definition for 'T'.

对于属性,变量和方法会发生这种情况,我不太明白为什么 - 当然编译器知道T是一个类型,因此可以像第一个例子中那样找出它?

简短版:为什么第一个例子有效,但不是第二个?

编辑:我刚刚发现,如果我"重构>重命名"类型参数,例如从T到U,IDE将其更改为:

class Z<U> {
  U T {
    get { ... }
    set { ... }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以那里的东西知道什么是类型,什么是成员名称

Chr*_*air 3

我认为另一种可能性在于错误消息:

类型“Z”已包含“T”的定义。

任何单一类型可能只能定义一次唯一命名的标识符(重载方法除外,因为它们也有参数)。

在第一个示例中X(类型)不是class 定义的Y;它是在外部定义的。而X(property)由 class 定义的Y

在第二个示例中Z<T>T(type) 由 class 定义ZT(property)由 class 定义Z。编译器认识到它正在为一个类创建两个同名的标识符,举起手说:“不!不!不!”

(然后正如 @Rawling 指出的那样,VS IDE 团队陷入了这个坏消息。)