C# generics ― why do lambdas work, when simple methods don't?

匿名 (未验证) 提交于 2019-12-03 03:04:01

问题:

I'm having trouble understanding why the C# compiler can infer types for

Array.ConvertAll(new int[1], i => Convert.ToDouble(i)); 

but not for

Array.ConvertAll(new int[1], Convert.ToDouble); 

when it would seem that the former would be a more complicated deduction than the latter.

Could someone please explain why this happens?

回答1:

This issue is pretty well covered in this (archived) blog post: http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx

In summary as I understand it (should the link ever vanish); this was a conscious design decision in C# 3.0, in that it was not appropriate to perform type inference on Method Groups (your second example).

I guess quite a few folks didn't like that, so the issue was resolved for C# 4.0 (as of Visual Studio 2010);

"In C# 4.0, return type inference works on method group arguments when the method group can be associated unambiguously with a completely fixed set of argument types deduced from the delegate. Once the argument types associated with the method group are known, then overload resolution can determine unambiguously which method in the method group is the one associated with the delegate formal parameter; we can then make a return type inference from the specific method to the delegate return type."



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!