Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个电话模棱两可?_C#_Visual Studio 2008_C# 3.0_Extension Methods - Fatal编程技术网

C# 为什么这个电话模棱两可?

C# 为什么这个电话模棱两可?,c#,visual-studio-2008,c#-3.0,extension-methods,C#,Visual Studio 2008,C# 3.0,Extension Methods,谁能解释一下,为什么下面的代码会产生错误?(在Microsoft Visual Studio 2008中编译) classbase1{}; 类Base2{} 接口I1{} 接口I2{} C类:I1,I2{} 静态类程序 { 静态T M1(此T T,I1 x),其中T:Base1 { 返回t; } 静态T M1(此T T,I2 x),其中T:Base2 { 返回t; } 静态void Main(字符串[]参数) { Base1 b1=新的Base1(); C=新的C(); b1.M1(c); }

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

classbase1{};
类Base2{}
接口I1{}
接口I2{}
C类:I1,I2{}
静态类程序
{
静态T M1(此T T,I1 x),其中T:Base1
{
返回t;
}
静态T M1(此T T,I2 x),其中T:Base2
{
返回t;
}
静态void Main(字符串[]参数)
{
Base1 b1=新的Base1();
C=新的C();
b1.M1(c);
}
}
错误是

以下方法或属性之间的调用不明确:“
ConsoleApplication1.Program.M1(ConsoleApplication1.Base1,ConsoleApplication1.I1)
”和“
ConsoleApplication1.Program.M1(ConsoleApplication1.Base1,ConsoleApplication1.I2)


我认为编译器可以使用“where”子句区分两个方法,约束不是方法签名的一部分,因此不用于解析。

约束不是签名的一部分。有关详细信息,请参阅。

约束不能用于解析关联。

我认为泛型约束不符合方法签名的一部分。泛型约束不参与重载解析。很遗憾,这是一个重复的问题。其要点是,在查找可行的匹配方法重载时,不考虑泛型约束,编译器在考虑这些约束之前会失败。这里有很多问题,我只需要找到正确的搜索关键字。
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);
    }
}