繁体   English   中英

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

[英]How is this kind of abuse of generics not ambiguous/trigger an error in the compiler

我一直在感觉我的方式围绕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";
    }*/
}

我认为InClass的这个声明会抛出一个编译错误,因为它会使Test变得模棱两可。 它还使非通用Test无法在InClass调用。 注意我也在InClass注释了一些代码。 如果我取消注释该代码,我会收到编译器错误。

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

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

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

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

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

(显然,例子如下。)

所以语言设计师已经考虑过了,但可能会有更糟糕的选择。 (例如,即使您不想调用Test ,也无法创建像InClass这样的类会很烦人。)

看到这个相关的问题:

为什么通用类型约束不可继承/分层实施

Eric Lippert对潜在影响进行了彻底的探索。

继承的泛型类型不是由编译器强制执行的,因为他们开发团队认为这是一个不值得贬低的兔子洞。

我的猜测是,使用(int x)签名的方法比具有泛型类型Bar方法更适合于int ,在这种特殊情况下恰好是int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM