2012-04-03 15 views
1
次はVS2010で no suitable method found to overrideとエラーとしてマークされている理由は、私は疑問に思って

(.NET 4):私はthisを見つけたデフォルトパラメータとオーバーライド

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

多少似ているようだ(少なくともも驚くべき行動オプションのパラメータを使用して)、このメソッドがToString()をオーバーライドしない理由がわかりません。

は今、私は明らかに簡単にToStringメソッドをオーバーロードすることでこの問題を解決するかどうかは承知しているので、私は問題の解決に興味を持って、しかし、この制限の根拠ではありませんよ。

答えて

4

単純に同じ署名がありません。オーバーライドするメソッドは、オーバーライドするメソッドと厳密に同じシグネチャに制限されています。オプションのパラメータは、オーバーロードの構文上の砂糖だけではありません。それらはメソッドシグネチャの一部であり、結果として生じるILコードの一部でもあります。

この:

public virtual string ToString(); 

はこれと同じではありません。

public override string ToString(int foo = 0); 

あなたがそれをスライスどんなに。だから、エラー。

+0

しかし、それには何らかの理由がありますか?私は、想定されているC#+は簡単に何も壊さずにそのルールを変更できることを意味します。だから、それは単に「このように簡単です」か、それとも本当に問題になるコーナーケースですか? – Voo

+1

@Voo:私はコーナーケースを考えることはできませんが、大幅に変更することなく 'callvirt'(特定のメソッドシグネチャが必要です)が破損する可能性があります。だから... "このように簡単です"と私は思います。しかし、正当な理由があります。 – Ryan

0

機能string ToString(int foo=0)が(呼び出されたときに、それがコードに表示されていない場合でも)一つのパラメータを持っている、あなたがオーバーライド考え一つは、あなたがから0

0

何クラスを継承している持っていますか? '適切なメソッドが見つかりませんでした'というエラーから、基本クラスに仮想ToStringメソッドがないようです。ほとんどのデフォルトのC#クラスでは、ToStringをオーバーライドできません。

+1

私は 'オブジェクト'を推測しています:)そして、そうです、彼らは通常あなたが 'ToString'をオーバーライドできるようにします。実際に 'ToString'で' sealed'を使ったクラスを見たことはありません。 – Ryan

+0

実際には 'object'は実際には直接ではありませんが、簡単にするためには同じように仮定することができます;-)密封されたToStringはどこにもありません。 – Voo

1

ToString()ToString(int)は同じではありません。 ToString(int foo=0)の引数を省略すると、ToString(0)を書き込んだ場合と同じ結果になります。 fooは省略可能な引数ではなく、デフォルト値を持つ引数です。

関連する問題