Обновление:
§ 7.5.7 Этот доступ
A this-access состоит из зарезервированного слова this
.
это-доступ:
this
A этот доступ разрешен только в блоке конструктора экземпляра, метода экземпляра или метода доступа к экземпляру.
Это ни один из них. Компилятор 4.0 выглядит правильно. Предположительно это не устраивает, потому что по сути предоставляет доступ к this
в момент, когда тип не инициализирован. Возможно; -p
Обратите внимание, что я ожидаю, что это не this.someField
, что вызывает это - более того, что использование поля приводит к тому, что this
будет захваченным , то есть хочет поднять экземпляр this
на класс, сгенерированный компилятором, как если бы вы написали:
public MyCtor() : base( new SomeType(this).SomeMethod ) {...}
Компилятор C # 3.0 обнаруживает вышеупомянутое злоупотребление this
.
Воспроизводится. Исследуя. Это похоже на проблему, решающую неявное this
в цепочке конструктора.
Наиболее вероятный обходной путь - использовать метод virtual
вместо делегата и просто переопределить его в производном классе.
Один из обходных путей - вставить экземпляр в качестве аргумента, поэтому делегат становится "obj => obj.whwhat ..." и использует theDelegate(this);
.
Упрощенное воспроизведение:
public class MyBase {
public MyBase(Action a) { }
}
public class MySub : MyBase {
private string foo;
// with "this.", says invalid use of "this"
// without "this.", says instance required
public MySub() : base(delegate { this.foo = "abc"; }) { }
}
Мне нужно проверить спецификацию, но я не уверен, является ли this
допустимым в этом контексте ... поэтому компилятор 4.0 может быть верным.