[英]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.