C# 新的';动态';NET 4.0中的变量类型解决了CLR中的单方法/多方法分派问题?

C# 新的';动态';NET 4.0中的变量类型解决了CLR中的单方法/多方法分派问题?,c#,.net,c#-4.0,dynamic-typing,multiple-dispatch,C#,.net,C# 4.0,Dynamic Typing,Multiple Dispatch,对于那些使用静态类型语言(如Java和C#)进行编码的人来说,单次分派的问题最为常见。基本思想是: 虽然运行时多态性允许我们根据接收器的类型(运行时类型)分派到正确的方法调用,例如: IAnimal mything = new Cat(); mything.chop(); 方法调用将根据mything的运行时类型执行,即Cat。 这是单一分派功能(在Java/C#中提供) 现在,如果您不仅需要对receiver的运行时类型进行分派,还需要对(多个)参数的类型进行分派,那么您将面临一个小问题:

对于那些使用静态类型语言(如Java和C#)进行编码的人来说,单次分派的问题最为常见。基本思想是:

虽然运行时多态性允许我们根据
接收器的类型(运行时类型)分派到正确的方法调用,例如:

IAnimal mything = new Cat();
mything.chop();
方法调用将根据
mything
的运行时类型执行,即
Cat
。 这是单一分派功能(在Java/C#中提供)

现在,如果您不仅需要对receiver的运行时类型进行分派,还需要对(多个)参数的类型进行分派,那么您将面临一个小问题:

public class MyAcceptor {  
    public void accept (IVisitor vst) {...}   
    public void accept (EnhancedConcreteVisitor vst) {...}  
}
第二种方法永远不会被调用,因为在我们的“消费者”代码中,我们只是倾向于通过它们的公共超类型或接口来处理不同类型的对象(在我的示例中是访问者)


这就是我问的原因——因为动态类型允许多重分派多态性,而C#4.0有这个动态关键字;)

是的,您可以创建执行任意复杂分派的DLR类型。签出

是的,动态键入允许多个分派-否,您不必创建自己的动态对象来执行此操作

假设我们希望自己实现
Enumerable.Count()
,并且不希望在代码中加载“
if(源代码是IList)
”测试。我们可以这样写:

public static class Enumerable
{
    public static int Count<T>(this IEnumerable<T> source)
    {
        dynamic d = source;
        return CountImpl(d);
    }

    private static int CountImpl<T>(ICollection<T> collection)
    {
        return collection.Count;
    }

    private static int CountImpl(ICollection collection)
    {
        return collection.Count;
    }

    private static int CountImpl<T>(string text)
    {
        return text.Length;
    }

    private static int CountImpl<T>(IEnumerable<T> source)
    {
        // Fallback
        int count = 0;
        foreach (T t in source)
        {
            count++;
        }
        return count;
    }
}
公共静态类可枚举
{
公共静态整数计数(此IEnumerable源)
{
动态d=源;
返回CountImpl(d);
}
私有静态int CountImpl(ICollection集合)
{
返回集合。计数;
}
私有静态int CountImpl(ICollection集合)
{
返回集合。计数;
}
私有静态int CountImpl(字符串文本)
{
返回文本长度;
}
私有静态int CountImpl(IEnumerable源)
{
//退路
整数计数=0;
foreach(源中的T)
{
计数++;
}
返回计数;
}
}
我不是说这是个好主意,但这就是它的工作原理:)


请注意,您需要小心不要引入可能最终导致对某些类型的调用模棱两可的情况。这不是一个使用参数类的问题,而是考虑一个类可以实现多个接口。< /P>单/多方法调度问题是什么?我将用维基百科链接更新我的问题。Huh,问题是这样愚蠢吗?或者我错过了什么?我没有投你反对票,但你的问题可以改进。你指的是什么问题?你能举个例子吗?你似乎对它有一些熟悉/历史;假设我们没有。我现在将添加一个简短的解释。至少,这是
动态
的一个很好的例子。是的!这就是我想要的)非常感谢你的解释,还有一点希望看到Jon Skeet回答我的问题:)