如果您尝试实现两个可能"统一"某些类型参数的接口,Roslyn将抛出一个错误:
public interface IFoo{ void Method(T1 a, T2 b); } public class Foo : IFoo , IFoo { public void Method(T2 a, T1 b) { } public void Method(T1 a, T2 b) { } }
Foo类不会编译,Roslyn会给你一个错误,说" Foo
不能同时实现这两个IFoo
,IFoo
因为它们可能会统一某些类型参数替换." 尽管对于大多数类型的替换都很好,但Roslyn不会让你甚至宣布这个类,因为有人可能会使用T1 == T2的类型替换.
但是,编译器让你声明这个没有问题:
public class Bar{ public void Method(T1 t) { } public void Method(T2 t) { } }
这个类编译得很好,只有在客户端尝试调用该方法时才会抛出错误:
var bar = new Bar(); bar.Method(5);
Roslyn在这里给出了一个错误:"这个调用在以下方法或属性之间是不明确的:Bar
和Bar
."
我想知道为什么在这两种非常类似的情况下编译器的行为方式如此不同.一旦声明两个可能统一的方法,编译器是否应该抛出错误?
Bar.Method
可以调用每个单独的方法:
public class Bar{ public void Method(T1 t) { Console.WriteLine("FirstMethod"); } public void Method(T2 t) { Console.WriteLine("SecondMethod"); } } public static void CallFirstMethod (Bar bar, T1 t) { bar.Method(t); } public static void CallSecondMethod (Bar bar, T2 t) { bar.Method(t); } public static void Test() { var bar = new Bar (); CallFirstMethod(bar, 5); CallSecondMethod(bar, 6); }
因此,在这种情况下没有理由产生错误.