Cannot use 'this' in member initializer?
Is this legal? Does it contain a hidden bug or flaw? Visual studio does not give any errors or warnings but ReSharper does:
/// <summary>
/// immutable tuple for two
/// </summary>
public class Pair<TValue1, TValue2> : Singleton<TValue1>
{
public TValue2 Value2 { get; private set; }
public Pair(TValue1 value1, TValue2 valu开发者_Go百科e2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
: this(value1, value2, () => toStringFunc(this)) { } //Red light
}2> : Singleton<TValue1>
I'm pretty sure I've heard that this is a compiler bug, fixed in the next release. I'm just firing up my 4.0 VM, with a simpler test-case:
class Foo {
public Foo() : this(delegate { this.Bar(); }) { }
public Foo(Action foo) {}
public void Bar() {}
}
works in VS2008, but in VS2010:
Error 1 Keyword 'this' is not available in the current context
This is a bug in the C# 3 compiler that is fixed in C# 4.
Edit:
Corner case in using lambdas expression in base constructor
Your constructor will loop forever, until it pops the stack. This is because it keeps calling itself recursively. Try splitting it up:
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 */ }
精彩评论