Статический анализ оператора «is»

  Прежде чем переходить к сегодняшнему невероятному приключению, я хотел бы поздравить всё подразделение разработки с потрясающим продуктом, который мы запускаем официально. (Я приложил очень мало усилий к разработке Visual Studio 2012 и языку C# 5.0, поскольку был очень занят проектом Roslyn). Асинхронные возможности в языках C# и VB являются моими любимыми; новых возможностей очень…

1

Загадка с оператором «is». Часть 2

Как я и говорил в прошлый раз, это загадка была довольно простой: мы получим такое поведение, если FooBar или тип локальной переменной x будут параметром типа (type parameter). Т.е.: void M<FooBar>() {   int x = 0;   bool b = x is FooBar;  // корректно, true если FooBar – это int.   FooBar fb…

1

Загадка с оператором «is». Часть 1

  Возможно, что в программе с некоторой локальной переменной x: bool b = x is FooBar; во время исполнения присваивается b значение true, даже если преобразование типов (явное или неявное) переменной x к FooBar запрещено компилятором! Т.е. выражение: FooBar foobar = (FooBar)x; в той же самой программе не будет компилироваться. Можете ли вы придумать подобный…

3

Операторы преобразования не подчиняются дистрибутивному закону

Еще один интересный вопрос со StackOverflow. Давайте рассмотрим следующую неприятную ситуацию: object result; bool isDecimal = GetAmount(out result); decimal amount = (decimal)(isDecimal ? result : 0); Разработчик, написавший этот код, будет весьма удивлен, обнаружив, что этот код скомпилируется и в случае выполнения альтернативного пути сгенерирует исключение “invalid cast exception”. Кто-нибудь скажет почему? В обыкновенной математике…

0

Игнорирование скобок

Еще один забавный вопрос на StackOverflow: существует ли в C# разница между “return something;” и “return (something);”? Практически разницы нет. Теоретически разница может быть. Существует три интересных замечания в спецификации языка C#, из-за которых могут возникнуть проблемы. Первый пример: преобразование анонимных функций к делегатам или деревьям выражений (expression tree). Рассмотрим следующий код: Func<int> F1() {…

0

Это самое прекрасное время года

Вот небольшое праздничное приветствие для всех вас. Ну, или, по крайней мере, для жителей стран Содружества наций. static object M<T>(T t) where T : struct{  return t;} int ii = 10;int? jj = 20;object xx = ii;object yy = jj;System.ValueType zz = ii;IComparable aa = ii;System.Enum bb = MidpointRounding.ToEven;object cc = M(ii); Желаю всем вам…


В чём разница между операторами «as» и «приведения»?

Большинство людей скажут, чт о разница между «(Alpha)bravo» и «bravo as Alpha» в том, что первое бросает исключение при неуспехе преобразования, а последнее возвращает null. Хоть это и правильно, и это самая очевидная разница, дело не только в этом. Здесь есть ловушки, которых нужно остерегаться. Во-первых, поскольку результатом оператора «as» может быть null, целевым может…


Почему Char неявно конвертируется в ushort, но не наоборот?

Ещё один хороший вопрос со StackOverflow. Почему есть неявное преобразование из char в ushort, но только явное из ushort в char? Почему дизайнеры языка верят, что эти асимметричные правила имело смысл добавлять в язык? Ну, во-первых, очевидные вещи, которые бы не дали любому из преобразований быть неявным, тут неприменимы. Char реализован как беззнаковое 16-битное целое,…


Почему в ref и out параметрах нет вариантности типов?

Вот хороший вопрос со StackOverflow: Если у вас есть метод, принимающий «X», то вы должны передавать выражение типа X или что-то, приводимое к X. Скажем, выражение производного от X типа. Но если у вас есть метод, принимающий «ref X», то вы обязаны передавать ссылку на переменную типа X, точка. Почему это? Почему бы не разрешить…


Не всё наследуется от object

Я слышу много мифов о C#. Обычно в мифах есть крупица истины, например «типы-значения всегда размещаются на стеке». Если вы замените «всегда» на «иногда», то некорректное мифическое утверждение станет корректным. Миф, который я слышу особенно часто – «в C# все типы наследуются от object». Неправда! Во-первых, никакие типы-указатели ни унаследованы от object, ни совместимы с…