有时候,有一些东西是有用的:
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)
所以那里的东西知道什么是类型,什么是成员名称
我认为另一种可能性在于错误消息:
类型“Z”已包含“T”的定义。
任何单一类型可能只能定义一次唯一命名的标识符(重载方法除外,因为它们也有参数)。
在第一个示例中X(类型)不是由class 定义的Y;它是在外部定义的。而X(property)是由 class 定义的Y。
在第二个示例中Z<T>,T(type) 由 class 定义Z,T(property)也由 class 定义Z。编译器认识到它正在为一个类创建两个同名的标识符,举起手说:“不!不!不!”
(然后正如 @Rawling 指出的那样,VS IDE 团队陷入了这个坏消息。)