扩展方法不编译

时间:2013-05-23 12:23:33

标签: c# .net dynamic extension-methods

请考虑以下简单的扩展方法:

public static class MyExtensions
{
    public static int DemoLength(this string str, string toAdd)
    {
        return (str + toAdd).Length;
    }
}

我有可能称之为:

  1. 使用扩展程序

    int result1 = "hello".DemoLength("all");

  2. 来自静态类

    int result2 = MyExtensions.DemoLength("hello", "all");

  3. 现在考虑另一个例子:

    IQueryable<int> source = Enumerable.Range(0, 10).AsQueryable();
    Expression<Func<int, bool>> expr = t => (t & 1) == 0; // Even numbers
    LambdaExpression lambda = expr;
    
    1. 使用扩展程序

      IQueryable<int> result1 = source.Where((dynamic)lambda);

    2. 来自静态类

      IQueryable<int> result2 = Queryable.Where(source, (dynamic)lambda);

    3. 为什么这次扩展方法 无法编译

1 个答案:

答案 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'的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。