Во-первых, введение:
Этот код:
class C
{
int i = 5;
byte[] s = new byte[i];
}
не удается скомпилировать следующую ошибку:
Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство `C.i '
Resharper говорит нечто подобное: не удается получить доступ к нестатическому полю i
в статическом контексте.
Это соответствует тому, что С# spec говорит - что инициализатор поля не может получить доступ к экземпляру, создаваемому в данный момент (this
) или, в добавлении, любое из полей экземпляра:
Инициализатор переменных для поля экземпляра не может ссылаться на созданный экземпляр. Таким образом, это ошибка времени компиляции для ссылки это в переменном инициализаторе, поскольку это ошибка времени компиляции для инициализатор переменной для ссылки на любой экземпляр через простое имя.
Однако это отлично работает в Java:
class C {
int i = 5;
byte s[] = new byte[i]; //no errors here
}
Еще со мной? Хорошо, вот вопрос. Err, вопросы.
В гипотетическом мире, где это было бы справедливо в С#, мне интересно: возможно ли даже ? Если это так, , какие будут плюсы и минусы, которые он добавит в таблицу? Кроме того, поскольку он действительно поддерживается Java, делать те же самые плюсы и минусы для для Java? Или существует фундаментальная разница в том, как инициализаторы типов работают на двух языках?