为什么LINQ的First()需要显式强制转换,但在foreach中不需要?

时间:2016-12-12 20:33:24

标签: c#

有人可以解释这段代码是如何工作的吗?

Action a = action;

Delegate[] alist = a.GetInvocationList();

// conversion between System.Delagate and System.Action is done
foreach(Action ac in alist) {
}

// cannot convert from System.Delagate to System.Action
Delegate firstDelegate = alist.First();
Action firstAction = firstDelegate; // compile error needs explicit cast

但是......但是如果它需要并且显式转换为编译后的抱怨,怎么能在foreach语句中将Delegate转换为Action? 是在幕后使用显式演员吗?

1 个答案:

答案 0 :(得分:4)

  

如果它需要并且明确转换为编译后抱怨,它如何将foreach语句中的委托转换为动作?

长话短说,foreach语句代表您添加了明确的演员。这是为了在引入泛型之前与C#兼容。这个想法是为了简化无类型集合的迭代,例如

// Use an untyped list which stores System.Object objects
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2);
list.Add(4);
list.Add(8);
foreach (int x in list) { // C# inserts a cast for you
    Console.WriteLine(x);
}

因为强制转换存在于foreach中,代码将被编译,但它可能会在运行时中断。另一方面,LINQ的First()充分利用了静态类型检查,要求您指定显式转换。