C# 默认参数和重写

C# 默认参数和重写,c#,.net,C#,.net,我想知道为什么在VS2010.NET 4中找不到可重写的合适方法时将以下内容标记为错误: public override string ToString(int foo=0) { // some stuff } 我发现这似乎有点相似,至少在可选参数方面也有令人惊讶的行为,但我不明白为什么这个方法不重写ToString 现在我清楚地知道如何通过重载ToString轻松解决这个问题,所以我对这个问题的解决方案不感兴趣,而是对这个限制背后的原理感兴趣。它根本没有相同的签名。重写方法被严格限

我想知道为什么在VS2010.NET 4中找不到可重写的合适方法时将以下内容标记为错误:

public override string ToString(int foo=0) {
     // some stuff
}
我发现这似乎有点相似,至少在可选参数方面也有令人惊讶的行为,但我不明白为什么这个方法不重写ToString


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

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

这:

与此不同:

public override string ToString(int foo = 0);

不管你怎么切。因此,错误。

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

这:

与此不同:

public override string ToString(int foo = 0);

不管你怎么切。因此,错误。

函数字符串tostringnt foo=0有一个参数,即使调用时它没有出现在代码中,您想重写的函数字符串有0

函数字符串ToStringint foo=0有一个参数,即使调用时它没有出现在代码中,您想重写的类有0,您从哪个类继承?从错误“找不到要重写的合适方法”中可以看出基类没有虚拟ToString方法。大多数默认c类不允许重写ToString。

您从哪个类继承?从错误“找不到要重写的合适方法”中可以看出基类没有虚拟ToString方法。大多数默认c类不允许重写ToString。

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

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

我猜是object:是的,它们通常允许您重写ToString。事实上,我不能说我见过一个使用sealed-on-ToString的类。事实上,这不是直接对象,但为了简单起见,你也可以假设;-任何地方都没有涉及到密封的ToString。我猜object:是的,它们通常允许您重写ToString。事实上,我不能说我见过一个使用sealed-on-ToString的类。事实上,这不是直接对象,但为了简单起见,你也可以假设;-任何地方都没有涉及到密封的ToString,但有什么原因吗?我的意思是,在我看来,一个假定的C+可以很容易地改变规则而不破坏任何东西。那么,这只是一种更简单的方法,还是有任何角落的情况会真正造成问题?@Voo:我想不出任何角落的情况,但它可能会打破callvirt,它需要某种方法签名,而无需进行大量修改。所以我想这样更简单。但是有充分的理由。但是有什么理由吗?我的意思是,在我看来,一个假定的C+可以很容易地改变规则而不破坏任何东西。那么,这只是一种更简单的方法,还是有任何角落的情况会真正造成问题?@Voo:我想不出任何角落的情况,但它可能会打破callvirt,它需要某种方法签名,而无需进行大量修改。所以我想这样更简单。但是有很好的理由。