默认参数和覆盖

本文关键字:覆盖 参数 默认 | 更新日期: 2023-09-27 18:29:59

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

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

我发现这似乎有点相似(至少还有可选参数的令人惊讶的行为),但我不明白为什么这个方法不覆盖ToString()

现在我显然知道如何通过重载ToString来轻松地解决这个问题,所以我对这个问题的解决方案不感兴趣,而是对这个限制背后的原理感兴趣。

默认参数和覆盖

它根本没有相同的签名。重写方法被限制为与它们要重写的方法严格相同的签名,可选参数不仅仅是重载的语法糖;它们也是方法签名的一部分,甚至是生成的IL代码的一部分。

此:

public virtual string ToString();

与此不同:

public override string ToString(int foo = 0);

不管你怎么切。所以,错误。

ToString()ToString(int)不相同。如果省略ToString(int foo=0)的参数,则与编写ToString(0)的情况相同foo是一个具有默认值的参数,而不是可选参数。

函数string ToString(int foo=0)有一个参数(即使调用时它没有出现在代码中),您想覆盖的参数有0

您从哪个类继承?从错误"找不到合适的方法来覆盖"来看,基类似乎没有虚拟ToString方法。大多数默认的c#类不允许重写ToString。