Аномалия инициализации

Дополнение: Я выяснил, что эта проблема значительно более загадочна, чем изначально думал исходя из отчета об ошибке. Я переписал примеры в этой статье, поскольку предыдущие примеры на самом деле не иллюстрировали ошибку. Рассмотрим следующий код: struct S { private string blah; public S(string blah) { this.blah = blah; } public void Frob() { // что…


Почему я не могу получить доступ к защищенному члену из производного класса? Часть 6

Читатель Джес Макгрю (Jesse McGrew) задал отличный дополнительный вопрос к моему сообщению 2005 года о том, почему вы не можете получить доступ к защищенному члену из производного класса. (Вам, видимо, стоит прочитать еще раз эти те сообщения, чтобы легче понять смысл этого). Я хочу прояснить вопросы терминологии. Предположим, вы вызываете foo.Bar() внутри класса C. Значение…


Замыкания на переменных цикла. Часть 2

Спасибо всем, кто оставил содержательные и глубокие комментарии для предыдущего сообщения[1]. Большинству стран действительно стоит применить методы «мажоритарно-преференциального[2]» голосования. Эта же система лучше подходит гикам. Многие оставили свои мнения в форме: «Я бы хотел, чтобы вы внесли изменения, но если не можете, тогда выдавайте предупреждения». Или «Не вносите изменения, просто добавьте предупреждения» и т.д. Но…


О вреде замыканий на переменных цикла

Я не знаю, почему я до сих пор не писал об этом в своем блоге, ведь это один из самых распространенных некорректных отчетов об ошибке, которые мы получаем. Многие считают, что они нашли ошибку в компиляторе, но на самом деле с компилятором все в порядке, а ошибка находится в их коде. Это ужасная ситуация для…


Void не вариантен

[ДОПОЛНЕНИЯ ниже] Некоторое время назад я описал вид вариантности, который мы поддерживаем, начиная с C# 2.0. При присваивании группы методов делегату такого типа, что и выбранный метод, и делегат возвращают ссылочный тип, то разрешено ковариантное преобразование. То есть, вы можете сказать: Giraffe GetGiraffe() { … }…Func<Animal> f = GetGiraffe; Это работакт логично, потому что всякий,…


Зарезервированные и контекстные ключевые слова

Многие языки программирования, включая C#, трактуют определённые цепочки символов как «особые». Некоторые цепочки настолько особы, что не могут использоваться для идентификаторов. Давайте назовём их «зарезервированными ключевыми словами», а все остальные особые цепочки будем называть «контекстными ключевыми словами». Они «контекстные» потому, что цепочка может означать одно в контексте, где ожидается ключевое слово, и другое в контексте,…