C#扩展方法歧义:扩展的类不是签名的一部分吗?

时间:2014-05-29 22:27:46

标签: c# extension-methods

我对某些扩展方法存在歧义问题。我有几个类似的类,每个类都有一个名为“ToEntity”的扩展方法。如果将多个这些扩展方法放入范围,编译器就不知道使用哪个,即使它似乎能够通过检查扩展类尝试使用它来辨别它。显然事实并非如此,但也许我做错了什么?例如:

// these classes both have ToEntity() extension methods which return MyEntity
MyExtendedClass1 model1 = new MyExtendedClass1();
MyExtendedClass2 model2 = new MyExtendedClass2();

MyEntity myEntity1 = model1.ToEntity(); // ambiguous... why?

在过去的几个月里,我通过调用其中一个超级蹩脚的方法“ToEntity2()”来绕过这个方法,特别是现在我正在添加更多需要ToEntity()扩展的类。现在我正在重构并希望找到更好的方法。所以我想我的明确问题是:

为什么这些方法不明确而不是被它们扩展的类区分? 我可以选择什么样的解决方案?

更新:我的扩展方法将如下定义:

public static class MyExtensions
{
    public static MyEntity ToEntity(this MyExtendedClass1 myExtClass)
    {
        // do stuff with myExtClass
        // eventually return a MyEntity
    }

    public static MyEntity ToEntity(this MyExtendedClass2 myExtClass)
    {
        // do stuff with myExtClass
        // eventually return a MyEntity
    }
}

1 个答案:

答案 0 :(得分:1)

是否在界面上定义了一种扩展方法?例如,这会导致模糊的调用错误:

public static class Ext
{
    public static void A(this IComparable<int> a) { }
    public static void A(this ValueType a) { }
    public static void CallSite() { 1.A(); }
}

错误是:

  

以下方法或属性之间的调用不明确:   'Namespace.Ext.A(System.IComparable)'和   'Namespace.Ext.A(System.ValueType)'

但是,如果在基类上定义了所有扩展方法,则模糊性消失。例如:

public static class Ext
{
    public static void A(this Object a) { }
    public static void A(this ValueType a) { }
    public static void CallSite() { 1.A(); }
}
相关问题