我想知道为什么不允许通用重载,并且它会导致“模棱两可”的分辨率的编译器错误。
这是示例代码:
class Program
{
static void Main(string[] args)
{
var p = new Program();
p.DoWork(new First());
p.DoWork(new Second());
p.DoWork(new Multi()); //ambiguous: that's right!
p.Test<IFirst>(new First()); //ambiguous???
}
private void DoWork(IFirst arg) { }
private void DoWork(ISecond arg) { }
private void Test<T>(T arg) where T : IFirst { }
private void Test<T>(T arg) where T : ISecond { }
}
interface IFirst { }
interface ISecond { }
class First : IFirst { }
class Second : ISecond { }
class Multi : IFirst, ISecond { }
在显式声明要考虑的接口后,我无法感觉到显式形式(DoWork)与通用形式之间的区别。为什么第一个允许,第二个不允许?
我的目标是让两种“测试”方法的行为类似,但不完全相同。
有什么解决方法(除了以不同的方式命名方法之外)?
谢谢大家。
最佳答案