Не можете использовать 'this' в инициализаторе члена? - PullRequest
8 голосов
/ 08 января 2010

Это законно? Это содержит скрытую ошибку или недостаток? 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 ]

9 голосов
/ 08 января 2010

Я почти уверен, что слышал, что это ошибка компилятора, исправленная в следующем выпуске. Я просто запускаю свою 4.0 VM с помощью более простого тестового примера:

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

работает в VS2008, но в VS2010:

Ошибка 1 Ключевое слово 'this' недоступно в текущем контексте

3 голосов
/ 08 января 2010

Это ошибка в компиляторе C # 3, исправленная в C # 4.

Edit:
Угловой регистр при использовании лямбда-выражения в базовом конструкторе

0 голосов
/ 08 января 2010

Ваш конструктор будет зацикливаться до тех пор, пока не появится в стеке. Это потому, что он продолжает называть себя рекурсивно. Попробуйте разделить его:

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 */ }
...