作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有时像这样的东西很有用:
class X {
...
}
class Y {
X X {
get { ... }
set { ... }
}
}
因为 X 描述了类型是什么(作为类名),以及被访问/改变的值(作为属性名)。到目前为止,一切都很好。假设你想做同样的事情,但以一种通用的方式:
class Z<T> {
T T {
get { ... }
set { ... }
}
}
对于这个例子,编译器提示:The type 'Z<T>' already contains a definition for 'T'
.
这发生在属性、变量和方法上,我不太明白为什么 - 编译器肯定知道 T 是一个类型,因此可以像第一个例子一样计算出来?
简短版本:为什么第一个示例有效,但第二个示例无效?
编辑:我刚刚发现,如果我“重构 > 重命名”类型参数,比如从 T 到 U,IDE 会将其更改为:
class Z<U> {
U T {
get { ... }
set { ... }
}
}
所以里面的东西知道什么是类型,什么是成员名
最佳答案
可能的答案:
当您编写非泛型版本时,您可能无法控制类 X
的名称,人们可能希望您的属性被称为 X
,因此您可能别无选择。
当您编写通用版本时,没有人真正关心您如何称呼类型参数,因此您可以通过选择另一个名称来解决这个问题。
因此,在编写新的通用编译器内容时,团队“我们可以让我们的编译器能够弄清楚他什么时候指的是类型参数-T
以及什么时候他的意思是 property-T
,但这并不是真正必要的,因为他可以解决它,所以让我们把时间花在更有成效的事情上。”
(然后 VS 团队说“该死,编译器团队让我们背负了这个,现在我们需要弄清楚如何让用户在发现它无法编译时重构它”...)
关于c# - 为什么泛型类型参数和其他成员之间存在名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12972136/
我是一名优秀的程序员,十分优秀!