有人可以解释这段代码是如何工作的吗?
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? 是在幕后使用显式演员吗?
答案 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()
充分利用了静态类型检查,要求您指定显式转换。