为什么这个调用会产生歧义?

6

有人能解释一下,为什么以下代码会产生错误?(在Microsoft Visual Studio 2008中编译)

class Base1 {  };
class Base2 {  }

interface I1   {   }
interface I2   {   }

class C : I1, I2 { }

static class Program
{

    static T M1<T>(this T t, I1 x) where T : Base1
    {
        return t;
    }

    static T M1<T>(this T t, I2 x) where T : Base2
    {
        return t;
    }

    static void Main(string[] args)
    {
        Base1 b1 = new Base1();
        C c = new C();
        b1.M1(c);
    }
}

错误信息为:

“调用 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I1)' 和 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I2)' 两个方法或属性模糊不清。”

我曾认为编译器可以使用“where”子句来区分这两个方法。


我认为泛型约束不应被视为方法签名的一部分。 - oscilatingcretin
泛型约束不参与重载决策。 - Oded
很遗憾,这是一个重复的问题。其要点是在查找可行的匹配方法重载时不考虑通用约束条件,编译器在考虑这些条件之前就会失败。关于这个问题,SO上已经有很多类似的问题了,我只需要找到正确的搜索关键字即可。 - Lasse V. Karlsen
http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx - Thomas Levesque
3个回答

13

约束条件不是方法签名的一部分,因此不用于解析。


3

0

约束不能用于解决关联。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接