8

これは合法ですか?隠れたバグや欠陥が含まれていますか?Visual Studioはエラーや警告を出しませんが、ReSharperは次のことを行います。

/// <summary>
/// immutable tuple for two
/// </summary>
public class Pair<TValue1, TValue2> : Singleton<TValue1>
{
    public TValue2 Value2 { get; private set; }
    public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
        : this(value1, value2, () => toStringFunc(this)) { } //Red light

}2> : Singleton<TValue1>
4

3 に答える 3

9

これはコンパイラのバグであり、次のリリースで修正されると聞いたことがあると思います。より単純なテストケースを使用して、4.0VMを起動しています。

class Foo {
    public Foo() : this(delegate { this.Bar(); }) { }
    public Foo(Action foo) {}
    public void Bar() {}
}

VS2008で動作しますが、VS2010では:

エラー1キーワード「this」は現在のコンテキストでは使用できません

于 2010-01-07T21:05:05.297 に答える
3

これは、C#4で修正されたC#3コンパイラのバグです。

編集:
ベースコンストラクターでラムダ式を使用する場合のコーナーケース

于 2010-01-07T21:05:29.087 に答える
0

コンストラクターは、スタックをポップするまで、永久にループします。これは、再帰的に自分自身を呼び出し続けるためです。それを分割してみてください:

public Pair(TValue1 value1, TValue2 value2)
    : this(value1, value2, () => toStringFunc(this)) { }

public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
    { /* some actual logic */ }
于 2010-01-07T21:06:02.097 に答える