首先我有这种线
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll<Guid>(o => Guid.Parse(o));
然后ReSharper给了我一个提示,我可以将它转换为方法组。该操作的结果是这个
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll<Guid>(Guid.Parse);
我对语法感到困惑..它是如何以及为什么有效?我的意思是没有parse方法的参数。魔术我会说。
更新
更紧凑的转换
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll(Guid.Parse);
答案 0 :(得分:3)
ConvertAll
(在此上下文中)此处需要Converter<string,Guid>
- 一个方法的委托,该方法接受string
并返回Guid
。静态Guid.Parse
完全满足 - 与我们编写new Converter<string,Guid>(Guid.Parse)
或写成:
Converter<string,Guid> conv = Guid.Parse; // perfectly valid
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll<Guid>(conv);
lambda 版本通过匿名方法添加间接级别:
static Guid <>____blah(string o) { return Guid.Parse(o); }
所以直接调用Guid.Parse
实际上略微更有效率。
答案 1 :(得分:3)
它正在使用方法组转换。它正在做这样的事情:
// Very long-winded C# 1 syntax
Converter<String, Guid> converter = new Converter<String, Guid>(Guid.Parse);
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll(converter);
// Simpler C# 2 syntax
Converter<String, Guid> converter = Guid.Parse;
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll(converter);
现在内联变量,然后转到原始代码。这会让事情更清楚吗?