一位同事向我指出了C#中的一个奇怪案例(虽然不确定这是否确实很奇怪)。
假设您有一个Employee类。如果要创建Employee类型的Generic List <>,只需执行以下操作:
List<Employee> x = new List<Employee>;
我知道我需要将Employee类型传递给Generic列表,以便它知道有关Employee的必需类型信息,并生成返回和接受与Employee兼容的参数的方法。
现在我的问题是,为什么不能执行以下操作?
Employee x = new Employee();
List<typeof(x)> list = new List<typeof(x)>();
这是否足以满足List <>所需的信息以创建列表?换句话说,现在将x的类型(即Employee的类型)作为通用类型参数传递给List <>,这(我曾经相信)与传递列表的类型名称相同(在本例中为Employee) 。
我知道在Java中(使用.class)关键字可以在变量上使用类似的内容。
我确定我想念一些东西,所以请启发我!
不,Java中没有等效的功能。您不能使用“ x.class”来获取变量的声明类型。
此外,typeof(x)
不C#中工作,要么得到一个变量的类型-它返回Type
的引用类型的名称,例如:typeof(string)
将返回的引用Type
与关联的对象System.String
类型。这相当于String.class
在Java中使用。(再次注意,这适用.class
于类型名称,而不是变量名称。)
Java泛型也不支持您的最终声明。如果您认为他们愿意,请提供示例:)
您可以在C#中做的是使用类型推断来做您想做的事情:
public static List<T> CreateListForSampleType<T>(T sample)
{
return new List<T>();
}
...
Employee x = new Employee();
var list = CreateListForSampleType(x);
请注意,没有理由不能将C#扩展为允许类似typeof(variablename)
或List<typeof(variablename)>
-毕竟这都是编译时类型信息。但是,我看不到它能满足团队对有用性的要求...我想首先看到其他有用的功能:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句