当前位置:  开发笔记 > 编程语言 > 正文

为什么在C#Generics中无法做到这一点?

如何解决《为什么在C#Generics中无法做到这一点?》经验,为你挑选了1个好方法。

一位同事用C语言向我指出了一个奇怪的案例(不太确定这是否真的很奇怪).
假设您有一个Employee类.如果要创建Employee类型的Generic List <>,您可以简单地执行以下操作:

List x = new List;

我知道我需要将Employee类型传递给Generic列表,以便它知道有关Employee的必需类型信息,并生成返回和接受与Employee兼容的参数的方法.

现在我的问题是,为什么不可能做到以下几点?

Employee x = new Employee();
List list = new List();

这不足以满足List <>要知道的信息,以便创建列表吗?换句话说,作为Employee类型的x的类型现在作为泛型类型参数传递给List <>,它(我以前认为)与传递列表类型名称相同(在本例中为Employee) .

我知道在变量上使用Java(使用.class)关键字可以得到类似的东西.

我确定我错过了一些东西,所以拜托,欢迎我们!



1> Jon Skeet..:

不,这相当于没有在Java中可用.您不能使用"x.class"来获取变量的声明类型.

此外,typeof(x)不工作在C#或者得到一个变量的类型-它返回Type的引用类型的名称,例如:typeof(string)将返回的引用Type与关联的对象System.String类型.这相当于String.class在Java中使用.(再次注意,这适用.class于类型名称,而不是变量名称.)

Java泛型也不支持最终语句之类的任何内容.如果您相信他们这样做,请举例:)

可以在C#中执行的操作是使用类型推断来执行您想要的操作:

public static List CreateListForSampleType(T sample)
{
    return new List();
}

...

Employee x = new Employee();
var list = CreateListForSampleType(x);

需要注意的是,我们没有理由为什么C#不能扩展到允许类似typeof(variablename)List-这一切都编译时类型信息,毕竟.但是,我看不出它会满足团队对实用性的要求......还有其他更有用的功能我想先看看:)

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有