我想知道为什么不允许通用重载,并且它会导致“模棱两可”的分辨率的编译器错误。

这是示例代码:

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)与通用形式之间的区别。为什么第一个允许,第二个不允许?

我的目标是让两种“测试”方法的行为类似,但不完全相同。

有什么解决方法(除了以不同的方式命名方法之外)?

谢谢大家。

最佳答案

Constraints are not part of the signature

09-08 02:55