Ответ 1
Update:
§ 7.5.7 Этот доступ
Этот доступ состоит из зарезервированного слова
this
.доступа:
this
Этот доступ разрешен только в блоке конструктора экземпляра, метода экземпляра или экземпляра экземпляра.
Это ничто из этого. Компилятор 4.0 выглядит правильно. Предположительно это недовольство, потому что это по существу обеспечивает доступ к this
в момент, когда тип не инициализируется. Может быть; -p
Обратите внимание, что я ожидаю, что это не так, как это делает this.someField
- больше того, что использование поля вызывает this
, что означает, что он хочет поднять экземпляр this
на компилятор - сгенерированный класс - как будто вы написали:
public MyCtor() : base( new SomeType(this).SomeMethod ) {...}
Компилятор С# 3.0 указывает на злоупотребление выше this
.
Воспроизводится. Исследуя. Это выглядит как проблема, разрешающая неявный this
в цепочке конструктора.
Наиболее вероятным решением было бы использовать метод virtual
вместо делегата и просто переопределить его в производном классе.
Одним из способов решения проблемы было бы преобразовать экземпляр в качестве аргумента, поэтому делегат станет "obj = > obj.whatever..." и используйте 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 может быть правильным.