gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:11:05 26 4
gpt4 key购买 nike

有时像这样的东西很有用:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com