我想知道为什么以下在VS2010(.NET 4)中将no suitable method found to override
标记为错误:
public override string ToString(int foo=0) {
// some stuff
}
我发现this似乎有些相似(至少也是可选参数的惊人行为),但我不明白为什么这个方法不会覆盖ToString()
。
现在我很清楚如何通过重载ToString轻松解决这个问题,所以我不对这个问题的解决方案感兴趣,但是在这个限制背后的理由中。
答案 0 :(得分:4)
它没有相同的签名。重写方法仅限于与它们重写的方法完全相同的签名,可选参数不仅仅是重载的语法糖;它们也是方法签名的一部分,甚至是生成的IL代码的一部分。
此:
public virtual string ToString();
与此不一样:
public override string ToString(int foo = 0);
无论你如何切片。所以,错误。
答案 1 :(得分:1)
ToString()
和ToString(int)
不一样。如果省略ToString(int foo=0)
的参数,那么如果您编写ToString(0)
则相同。 foo 是具有默认值的参数,而不是可选参数。
答案 2 :(得分:0)
函数string ToString(int foo=0)
有一个参数(即使它在调用时没有出现在代码中),你想要覆盖的那个参数有0
答案 3 :(得分:0)
你从哪个班继承?从错误“没有找到合适的方法来覆盖”看来,基类没有虚拟的ToString方法。大多数默认的c#类不允许重写ToString。