c# – 为什么在通用类型参数和其他成员之间有一个名字冲突

c# – 为什么在通用类型参数和其他成员之间有一个名字冲突,第1张

概述有时候这样做是有用的: class X { ...}class Y { X X { get { ... } set { ... } }} 因为X描述了类型是什么(作为类名称)和正在访问/变异的值(作为属性名称).到现在为止还挺好.假设你想做同样的事情,但是以通用的方式: class Z<T> { T T { get { ... } set { @H_404_0@有时候这样做是有用的:
class X {  ...}class Y {  X X {    get { ... }    set { ... }  }}

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

class Z<T> {  T T {    get { ... }    set { ... }  }}

对于这个例子,编译器抱怨说:类型’Z< T>已经包含’T’的定义.

这是属性,变量和方法发生的,我不太明白为什么 – 编译器肯定知道T是一个类型,因此可以按照与第一个例子相同的方式计算出来?

简短版本:为什么第一个例子工作,但不是第二个例子?

编辑:我刚刚发现,如果我从“T”到“U”这个类型参数“Refactor> Rename”,那么IDE会将其更改为:

class Z<U> {  U T {    get { ... }    set { ... }  }}

所以在那里知道什么是一个类型,什么是成员名称

解决方法 我想到的另一种可能是错误信息:

The type ‘Z’ already contains a deFinition for ‘T’.

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

在第一个例子中,X(类型)不是由类Y定义的;它被定义在外面.而X(属性)由类Y定义.

在Z的第二个例子中,T(类型)由类Z定义,T(属性)也由类Z定义.编译器认识到它为单个类创建了两个相同名称的标识符,抛出它举起来说:“不,不,不!

(然后,@Rawling指出,VS IDE团队陷入了坏消息.)

总结

以上是内存溢出为你收集整理的c# – 为什么在通用类型参数和其他成员之间有一个名字冲突全部内容,希望文章能够帮你解决c# – 为什么在通用类型参数和其他成员之间有一个名字冲突所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1261340.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存