2

抽象ジェネリッククラスがあります

public abstract class Foo<TType>

抽象メソッドで

public abstract object DoSomething(TType arg = default(TType)) {}

さて、継承されたクラス

public class BabyFoo : Foo<string>

DoSomethingをオーバーライドし、「override」と入力して、インテリセンス/ジェネレーターにメソッドスケルトンを記述させたい場合

public override object DoSomething(string arg = default(string))

あるいは

public override object DoSomething(string arg = null)

しかし、それは文字通り思い付く

public override object DoSomething(string arg = default(TType))

オプションのパラメーターはc#の新機能であるため、最初はVS2010のバグだと思っていましたが、IDEがこのコードを生成する本当の理由(参照型と値型??)があるかどうかを誰かに教えてもらえますか?

4

1 に答える 1

4

明確にするために:

public abstract class Foo<TType>
{
    public abstract object DoSomething(TType arg = default(TType));
}

public class BabyFoo : Foo<string>
{
    // Expected:
    public override object DoSomething(string arg = default(string))
    // Actual:
    public override object DoSomething(string arg = default(TType));
}

私が見逃しているものがない限り、それはVisual Studio IDE/code-genのバグにすぎません。メソッドのシグネチャを「期待される」ものに変更すると、コードがコンパイルされます。これは、「実際の」ものが明らかに無効であるためにコンパイルを拒否するためです。

TType制約などのいくつかの異なるタイプを試しましたが、where TType : new()VSにあなたのDoSomethingメソッドで有効なコードを生成させることができませんでした。

おめでとうございます-あなたは(おそらく)Visual Studioにバグを見つけました=)

コード生成に関しては常にエッジケースがあります。私はずっと前にVisualBasic2005/2008にログを記録しました、比較的あいまいなものであったため、WONTFIXで解決されました。うまくいけば、これは修正されるでしょう!

于 2010-08-17T14:51:44.467 に答える