扩展方法和动态变量

Extension methods & dynamic vars

动态变量不支持扩展方法有什么原因吗?有什么办法可以避免吗?

这里有一个例子:

我没有忘记 class 的 using 指令持有我正在使用的扩展方法:

using System.Linq;

这段代码没有问题:

IEnumerable<string> ie = new HashSet<string>() { "test" };
Console.WriteLine(ie.ToList()[0]);

这个抛出异常:

IEnumerable<string> ie = new HashSet<string>() { "test" };
Console.WriteLine(((dynamic)ie).ToList()[0]);

''System.Collections.Generic.HashSet' does not contain a definition for 'ToList''

Linq 的 ToList 需要 编译时间 -IEnumerable。通过使用 dynamic 您可以完全隐藏编译时类型并使编译器无法推断出正确的方法。所以你依赖于运行时绑定。

现在扩展方法只是 static 方法的语法糖:

static class Enumerable
{
    public static List<T> ToList(IEnumerable<T> e) { ...}
}

你可以这样称呼它:

Enumerable.ToList(myHashSet);

编译器也是这样做的。它将所有对 hashSet.ToList() 的调用转换为 Enumerable.ToList(hashSet)

此方法与您实际的 class - 哈希集 - 无关,因为扩展方法不会 修改 现有的 classes。他们只是定义了 看起来 就像将它们添加到 class 中一样的方法。或者换句话说:在运行时 - 这是评估 dynamic 的时候 - 没有这样的方法 HashSet.ToList,但是 Enumerable.ToList.