在成员初始化程序中不能使用'this'吗?

时间:2010-01-07 21:01:06

标签: c# lambda anonymous-methods

这合法吗?它是否包含隐藏的错误或缺陷? 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>

3 个答案:

答案 0 :(得分:9)

我很确定我听说这是一个编译错误,已在下一个版本中修复。我只是用更简单的测试用例启动我的4.0 VM:

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

适用于VS2008,但在VS2010中:

  

错误1关键字'this'在当前上下文中不可用

答案 1 :(得分:3)

这是在C#4中修复的C#3编译器中的错误。

编辑:
Corner case in using lambdas expression in base constructor

答案 2 :(得分: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 */ }