2014-04-28 22 views
3

我想用C#创建一个通用的列表和.NET 4.0泛型列表在C#4.0

List<var> varlist = new List<var>(); 此代码将产生错误“上下文关键字‘变种’可能只出现在局部变量声明”

之所以存在是因为我想要做这样的事情:

List<var> varList = new List<var>(); // Declare the generic list 
List<Object1> listObj1;    // List of Object1 
List<Object2> listObj2;    // List of Object2 

varList = listObj1;     // Assign the var list to list of Object1 

varList = listObj2;     // Re-assign the var list to the list of Object2 

有没有办法做到这一点在C#.NET 4.0?

+1

var不是一种类型。 – i3arnon

+0

使用'object'而不是'var' – Jonesopolis

+0

当你对你的列表有一个通用的引用时,你想用它做什么?'List '有几个基本接口,你可以参考它们,有些不是通用的,所以可以让你不关心类型,但是你可能不想用类型特定的东西。 –

回答

9

如果你想有一个通用的列表,那么你必须从某个地方定义泛型类型。我假设这是classlevel:

class MyClass<T> { 
    List<T> someGenericList = new List<T>(); 
} 

或者你使用的基类的所有类型:

List<object> someGenericList = new List<object>(); 

或者你把它dynamic(只有当你绝对相信你需要使用)

List<dynamic> someGenericList = new List<dynamic>(); 

还是最后一句:你适应你的设计。通常情况下,如果您必须定义这种高级类型的集合,您可以选择以允许您使用更多常用类型的方式对其进行重构。如果你想获得这方面的反馈,那么你将不得不提供更多关于上下文的信息。

不要忘记阅读MSDN: An introduction to C# generics

您的代码不起作用的原因是因为var是关键字而不是类型。它将自身替换为后面的表达式的实际类型,从而允许您正确地创建表达式,而不必先明确定义表达式。因此,为了使用它,实际上必须有一个遵循它的表达式。

+0

这与我写的有什么不同,与此同时我的回答没有明显的原因投票... –

+0

通用列表与“对象”类型的列表不同。这只是一个非常模糊的列表。 –

1

您不能用var定义方法参数,因为var部分必须在编译时解析,编译器不能这样做。最好的办法是使用:

List<dynamic> dynamicList = new List<dynamic>(); 

其中,我认为,应该在编译时被解析为它的等效

List<object> dynamicList = new List<object>(); 

然后,每次你访问列表的成员,为了时间要使用它们来做一些有意义的事情,你必须明确地将它们转换为你需要的类型。你必须考虑是否值得这样做。这将是更好,如果你可以:

  1. 使用不同类型的
  2. 不同列表使用一个基类与正在与预期的行为重写相关的抽象或虚拟方法。
+1

除非你打算解释如何使用它,它不会工作,如果我们采取OP代码逐字逐句并改变它来使用这个。 –

0

将var更改为C#中不是关键字的内容。 例如

List<object> varlist = new List<object>(); 
+0

@PatrickHofman阅读Jeroen Vannevel的回答,并解释它与它无关......并且我们在同一时间发布我们的答案。 –

+0

它与'var'是一个关键词无关。 'dynamic'也是一个关键字。 –