默认参数和覆盖

时间:2012-04-03 01:28:39

标签: c# .net

我想知道为什么以下在VS2010(.NET 4)中将no suitable method found to override标记为错误:

public override string ToString(int foo=0) {
     // some stuff
}

我发现this似乎有些相似(至少也是可选参数的惊人行为),但我不明白为什么这个方法不会覆盖ToString()

现在我很清楚如何通过重载ToString轻松解决这个问题,所以我对这个问题的解决方案感兴趣,但是在这个限制背后的理由中。

4 个答案:

答案 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。

相关问题