Не можете использовать 'this' в инициализаторе члена?
Законно ли это? Содержит ли он скрытую ошибку или недостаток? 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 ответа:
Я почти уверен, что слышал, что это ошибка компилятора, исправленная в следующем выпуске. Я просто запускаю свою виртуальную машину 4.0 с более простым тестовым случаем:
class Foo { public Foo() : this(delegate { this.Bar(); }) { } public Foo(Action foo) {} public void Bar() {} }
Работает в VS2008, но в VS2010:
Ошибка 1 ключевое слово "this" недоступно в текущем контексте
Это ошибка в компиляторе C# 3, которая исправлена в C# 4.
Править:
угловой случай при использовании лямбда-выражения в базовом конструкторе
Ваш конструктор будет петлять вечно, пока не выскочит стек. Это потому, что он продолжает называть себя рекурсивно. Попробуйте разделить его:
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 */ }