请考虑以下简单的扩展方法:
public static class MyExtensions
{
public static int DemoLength(this string str, string toAdd)
{
return (str + toAdd).Length;
}
}
我有可能称之为:
使用扩展程序
int result1 = "hello".DemoLength("all");
来自静态类
int result2 = MyExtensions.DemoLength("hello", "all");
现在考虑另一个例子:
IQueryable<int> source = Enumerable.Range(0, 10).AsQueryable();
Expression<Func<int, bool>> expr = t => (t & 1) == 0; // Even numbers
LambdaExpression lambda = expr;
使用扩展程序
IQueryable<int> result1 = source.Where((dynamic)lambda);
来自静态类
IQueryable<int> result2 = Queryable.Where(source, (dynamic)lambda);
为什么这次扩展方法 无法编译 ?
答案 0 :(得分:3)
因为dynamic
不使用扩展方法,即使C#编译器知道这是dynamic
操作而可以将整个事物推迟到运行时,它也知道没有Where
方法可以在这里工作。
编译器告诉我们所有这些(取自编译示例中的代码):
'System.Linq.IQueryable'没有名为'Where'的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。
Queryable.Where
版本有效,因为它不再使用扩展方法。
举一个简单的例子说明:
static void Extension<T>(this string s, T t) {}
static void Main()
{
string s = "";
int i = 123;
s.Extension(i); // fine
s.Extension((dynamic)i); // doesn't compile;
}
特别注意编译器消息:
'string'没有名为'Extension'的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。