【发布时间】:2013-03-06 14:20:34
【问题描述】:
我需要类似的东西:
var myList;
foreach (MyObject myObject in myObjects)
{
myList = myList.Union(myObject.Items.Cast<Item>());
}
但似乎我无法初始化一个空变量。解决方案?
【问题讨论】:
我需要类似的东西:
var myList;
foreach (MyObject myObject in myObjects)
{
myList = myList.Union(myObject.Items.Cast<Item>());
}
但似乎我无法初始化一个空变量。解决方案?
【问题讨论】:
var 不是这样工作的,它使用类型推断来根据等号之后的内容分配类型。
此外,当您尝试访问myList 在初始化它之前(它会是null),这会引发空异常。试试这个:
IEnumerable<Item> myList = myObjects.SelectMany(m => m.Items.Cast<Item>());
【讨论】:
var myList = myObjects.SelectMany(m => m.Items.Cast<Item>());
var,只要你先给它分配一些东西:)
Union 返回相同的类型,考虑到您在其中使用IEnumerable<Item>,那么:
var myList = Enumerable.Empty<Item>();
【讨论】:
这不是 Union 的问题 - 这是尝试从 任何 未初始化的局部变量中读取的问题。
你可以使用:
var myVar = Enumerable.Empty<Item>();
... 或者只使用 SelectMany,如 mattytommo 所示,可能通过调用 Distinct() 来获取不同的元素(就像 Union 那样)。
【讨论】:
你必须指定变量的类型,并且你必须从一个空集合开始,例如:
IEnumerable<Item> myList = new List<Item>();
【讨论】:
编译器不知道你要创建哪种类型所以
var myList;
不足以告诉编译器myList 有什么类型。
你可以这样做
List<Item> myList;
但是对.Union 的调用会给你一个 NullReferenceException。
那么为什么不从一个空列表开始
List<Item> myList = new List<Item>
还是一个 IEnumerable?
IEnumerable<Item> myEnumerable = Enumerable.Empty<Item>()
【讨论】: