对于Lambda表达式,大家了解还是比较多的,本文将为大家讲解作者今天发现了一句有歧义的Lambda表达式,发出来供大家“把玩”。
#T#
先看引起“是非争端”的两个扩展方法:
- public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
- {
- foreach (T t in source) action(t);
- }
- public static void ForEach<T>(this IEnumerable<T> source, Func<T, object> func)
- {
- foreach (T t in source) func(t);
- }
***个ForEach扩展不用多说;第二个比较怪吧,其实没必要存在,我也想不起来之前为什么就写了这么一个扩展。
先别考虑第二个扩展的合理性,来看以下调用代码:
- public class People
- {
- public string Name { get; set; }
- public int Age { get; set; }
- }
- static public void Test()
- {
- People[] peoples = new People[]
- {
- new People { Name = "ldp615" },
- new People { Name= "Tom" },
- new People { Name ="Jim" }
- };
- peoples.ForEach(p => p.Age = 20);
- }
歧义在第15行,p => p.Age = 20。试问运行时会调用那个ForEach扩展呢??(先想想,答案在1楼)
两个ForEach,如果注释其中一个,代码同样能编译并运行,会自动匹配另外一个扩展。看来第15行有两重“含义”,如下:
- peoples.ForEach(p => { p.Age = 20; });
- eoples.ForEach(p => { return p.Age = 20; });
以上两行代码中的lambda都可以简写成为 p => p.Age = 20,也就导致了歧义。
那么在编译时,如何确定使用那个含义呢?应该看应用的上下文:
两个ForEach只保留一个时:使用与上下文相匹配的那含义(比较好理解)。
两个ForEach都存在时:我就不清楚了,可能是随机选一个吧,或者有优先级之说?(哪位高手知道,给我说声)
原文标题:一个有歧义的lambda表达式
链接:http://www.cnblogs.com/ldp615/archive/2009/11/11/1601304.html