这种滥用泛型的方式如何不模糊/在编译器中触发错误

Ear*_*rlz 4 .net c# generics specifications compiler-errors

我一直在感觉我的方式围绕C#编译器,它的限制是"继承的实例化泛型类".

无论如何,这是我的测试用例:

class Program
{
    static void Main(string[] args)
    {
        var x = new InClass();
        Console.WriteLine(x.Test(10)); //prints foo
        Console.ReadLine();
    }
}
class BaseClass<Foo, Bar>
{
    public virtual Foo Test(Bar b)
    {
        return default(Foo);
    }
    public virtual string Test(int b)
    {
        return "foo"; ;
    }
}
class InClass : BaseClass<string, int>
{
    /*public override string Test(int b)
    {
        return "bar";
    }*/
}
Run Code Online (Sandbox Code Playgroud)

我认为InClass的这个声明会抛出一个编译错误,因为它Test含糊不清.它也使得非泛型Test不可能在内部调用InClass.请注意我也有一些代码注释掉了InClass.如果我取消注释该代码,我会收到编译器错误.

是否在C#规范中提到了这种行为,或者这是闻所未闻的边缘情况?

Jon*_*eet 7

我认为InClass的这个声明会抛出一个编译错误,因为它会使Test变得模棱两可.

不.规范在7.5.3.6节中明确地提到了这种事情:

虽然声明的签名必须是唯一的,但是类型参数的替换可能会导致相同的签名.在这种情况下,上面的超载解决方案的打破平局规则将选择最具体的成员.

以下示例显示根据此规则有效且无效的重载.

(显然,例子如下.)

所以语言设计师已经考虑过了,但可能会有更糟糕的选择.(例如,InClass即使你不想打电话也不能创建一个类很烦人Test.)