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#规范中提到了这种行为,或者这是闻所未闻的边缘情况?
我认为InClass的这个声明会抛出一个编译错误,因为它会使Test变得模棱两可.
不.规范在7.5.3.6节中明确地提到了这种事情:
虽然声明的签名必须是唯一的,但是类型参数的替换可能会导致相同的签名.在这种情况下,上面的超载解决方案的打破平局规则将选择最具体的成员.
以下示例显示根据此规则有效且无效的重载.
(显然,例子如下.)
所以语言设计师已经考虑过了,但可能会有更糟糕的选择.(例如,InClass即使你不想打电话也不能创建一个类很烦人Test.)
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |