【发布时间】:2012-03-24 23:35:29
【问题描述】:
我在 IDataReader 上有两个扩展方法,具有以下签名:
internal static List<T> GetList<T>(this IDataReader reader, Func<string, T> del)
internal static double? GetDoubleOrNull(this IDataReader reader, string columnName)
GetDoubleOrNull 没有任何重载。
在其他地方,我可以做到
Func<string, double?> del = reader.GetDoubleOrNull;
var x = reader.GetList(del);
或
var x = reader.GetList<double?>(reader.GetDoubleOrNull);
或者只是传入一个实例方法,比如
public double? blah(string s)
var x = reader.GetList(blah);
但我做不到
var x = reader.GetList(reader.GetDoubleOrNull);
编译器报错
cannot convert from 'method group' to 'System.Func<string,double?>'
我不明白这一点。我认为由于GetDoubleOrNull 上没有重载,因此不会有重载决议,它可以从方法签名中推断类型参数。
真正令人困惑的部分是它在传入blah 时似乎是如何工作的。
【问题讨论】:
-
非常有趣。显式转换
var x = reader.GetList((Func<string, double?>)reader.GetDoubleOrNull)也可以。 Resharper 将强制转换标记为冗余,但没有它编译会失败。乔恩·斯基特在吗? -
有没有办法调用 Jon Skeet(或者 Eric Lippert)?说出他们的名字三遍还是什么?
标签: c# generics delegates extension-methods internals