2010-01-07 2 views
8

Является ли это законным? Он содержит скрытую ошибку или недостаток? Visual Studio не дает каких-либо ошибок или предупреждений, но ReSharper делает:Не можете использовать 'this' в инициализаторе члена?

/// <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> 

ответ

9

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

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

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

Ошибка 1 Ключевого слово «это» не доступно в течение контекст

+8

Да. Виноват. Сожалею! –

+0

Исправьте предупреждение null/struct, и я прощу вас ;-p –

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 */ } 
Смежные вопросы