2012г.
Количество страниц: 784
Перед вами - IV-е издание главной книжки по языку C#, написанной легендой программирования - Андерсом Хейлсбергом, архитектором C#, Delphi и Turbo Pascal, совместно с другими экспертами, входившими в группу девелоперов C# компании Майкрософт. Издание Язык программирования C#. Классика Computers Science. 4-е изд. Хейлсберг является максимально полным описанием языка и наиболее авторитетным источником информации по этой теме, построенным в формате сборника спецификаций, включающих в себя описание синтаксиса, сопутствующие материалы и примеры, и образцы кода. Эта книга - особого рода "библия" разработчика, которая легко может заменить как MSDN, так и иные книжки по C#. IV-е издание содержит описание новых особенностей C# 4.0, включая динамическое связывание, именованные и необязательные характеристики, и контравариантные и ковариантные обобщенные типы. Цель таких новшеств - расширение возможностей C# для взаимодействия с объектами, не относящимися к платформе .NET. Отличительная особенность нового издания тоже заключается в том, что каждая глава книжки содержит широкие комментарии, написанные известными "гуру" программирования, такими как Джон Скит, Джозеф Альбахари, Билл Вагнер, Кристиан Нейгел, Эрик Липперт и др.
Оглавление книги
Язык программирования C#. Классика Computers Science. 4-е изд. Хейлсберг
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
К читателю . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Об авторах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Об авторах комментариев . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Глава 1. Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.1. Здравствуй, Мир . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
1.2. Структура программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31
1.3. Типы и переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
1.4. Выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
1.5. Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
1.6. Классы и объекты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
1.6.1. Элементы класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46
1.6.2. Доступность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
1.6.3. Параметры-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48
1.6.4. Базовые классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
1.6.5. Поля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
1.6.6. Методы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
1.6.6.1. Параметры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52
1.6.6.2. Тело метода и локальные переменные . . . . . . . . . . . . . . . . . . . . .55
1.6.6.3. Статические методы и методы экземпляра . . . . . . . . . . . . . . . . .56
1.6.6.4. Виртуальные, переопределенные и абстрактные методы . . . . .57
1.6.6.5. Перегрузка методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60
1.6.7. Другие функциональные элементы класса . . . . . . . . . . . . . . . . . . . . . . .62
1.6.7.1. Конструкторы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
1.6.7.2. Свойства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
1.6.7.3. Индексаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
1.6.7.4. События . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
1.6.7.5. Операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
1.6.7.6. Деструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
1.7. Структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1.8. Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
1.9. Интерфейсы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .75
1.10. Перечисления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77
1.11. Делегаты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79
1.12. Атрибуты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Глава 2. Лексическая структура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
2.1. Программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83
2.2. Грамматики. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83
2.2.1. Система обозначений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83
2.2.2. Лексическая грамматика. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85
2.2.3. Синтаксическая грамматика. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85
2.3. Лексический анализ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85
2.3.1. Символы конца строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86
2.3.2. Комментарии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86
2.3.3. Пробельные символы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88
2.4. Лексемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
2.4.1. Управляющие последовательности Unicode . . . . . . . . . . . . . . . . . . . . . .88
2.4.2. Идентификаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89
2.4.3. Ключевые слова . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
2.4.4. Литералы (константы) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
2.4.4.1. Булевские константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
2.4.4.2. Целочисленные константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
2.4.4.3. Вещественные константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
2.4.4.4. Символьные константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
2.4.4.5. Строковые константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97
2.4.4.6. Константа null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100
2.4.5. Знаки операций и пунктуации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100
2.5. Директивы препроцессора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101
2.5.1. Символы условной компиляции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102
2.5.2. Выражения препроцессора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103
2.5.3. Директивы объявлений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103
2.5.4. Директивы условной компиляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105
2.5.5. Директивы диагностики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108
2.5.6. Директивы region . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .109
2.5.7. Директивы line. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .109
2.5.8. Директива pragma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110
2.5.8.1. Предупреждения pragma warning . . . . . . . . . . . . . . . . . . . . . . . . .111
Глава 3. Основные понятия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.1. Запуск приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113
3.2. Завершение работы приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114
3.3. Объявления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115
3.4. Элементы пространств имен и типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118
3.4.1. Элементы пространств имен . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119
3.4.2. Элементы структур. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119
3.4.3. Элементы перечислений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120
3.4.4. Элементы классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120
3.4.5. Элементы интерфейсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120
3.4.6. Элементы массивов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120
3.4.7. Элементы делегатов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120
3.5. Доступ к элементам. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121
3.5.1. Объявление вида доступа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121
3.5.2. Области доступности. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124
3.5.3. Доступ protected для элементов экземпляров . . . . . . . . . . . . . . . . . . .127
3.5.4. Ограничения доступа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129
3.6. Сигнатуры и перегрузка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130
3.7. Области видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133
3.7.1. Скрытие имен . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136
3.7.1.1. Скрытие в результате вложения . . . . . . . . . . . . . . . . . . . . . . . . . .137
3.7.1.2. Скрытие в результате наследования . . . . . . . . . . . . . . . . . . . . . .138
3.8. Имена пространств имен и типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140
3.8.1. Полные имена . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143
3.9. Автоматическое управление памятью . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144
3.10. Порядок выполнения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149
Глава 4. Типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
4.1. Типы-значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151
4.1.1. Тип System.ValueType. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152
4.1.2. Конструкторы по умолчанию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153
4.1.3. Структурные типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .154
4.1.4. Простые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155
4.1.5. Целочисленные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .156
4.1.6. Типы с плавающей точкой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .158
4.1.7. Десятичный тип . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .161
4.1.8. Булевский тип . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162
4.1.9. Перечислимые типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163
4.1.10. Обнуляемые типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163
4.2. Ссылочные типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .164
4.2.1. Классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165
4.2.2. Тип object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166
4.2.3. Тип dynamic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166
4.2.4. Тип string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166
4.2.5. Интерфейсы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166
4.2.6. Массивы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166
4.2.7. Делегаты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
4.3. Упаковка и распаковка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
4.3.1. Упаковка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168
4.3.2. Распаковка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170
4.4. Сконструированные типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172
4.4.1. Аргументы-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173
4.4.2. Открытые и закрытые типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173
4.4.3. Ограниченные и неограниченные типы . . . . . . . . . . . . . . . . . . . . . . . . .174
4.4.4. Соблюдение ограничений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174
4.5. Параметры-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175
4.6. Типы деревьев выражений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176
4.7. Тип dynamic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .177
Глава 5. Переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
5.1. Категории переменных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179
5.1.1. Статические переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
5.1.2. Переменные экземпляра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
5.1.2.1. Переменные экземпляра в классах . . . . . . . . . . . . . . . . . . . . . . .180
5.1.2.2. Переменные экземпляра в структурах . . . . . . . . . . . . . . . . . . . .181
5.1.3. Элементы массива . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181
5.1.4. Параметры-значения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181
5.1.5. Параметры-ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182
5.1.6. Выходные параметры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183
5.1.7. Локальные переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183
5.2. Значение по умолчанию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .185
5.3. Явное присваивание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186
5.3.1. Инициализированные переменные. . . . . . . . . . . . . . . . . . . . . . . . . . . . .187
5.3.2. Неинициализированные переменные. . . . . . . . . . . . . . . . . . . . . . . . . . .187
5.3.3. Точные правила для определения явного присваивания. . . . . . . . . . .188
5.3.3.1. Общие правила для операторов. . . . . . . . . . . . . . . . . . . . . . . . . .188
5.3.3.2. Блок, операторы checked и unchecked . . . . . . . . . . . . . . . . . . . .189
5.3.3.3. Оператор-выражение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189
5.3.3.4. Операторы объявления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189
5.3.3.5. Условный оператор. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190
5.3.3.6. Оператор выбора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190
5.3.3.7. Оператор цикла while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190
5.3.3.8. Оператор цикла do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191
5.3.3.9. Оператор цикла for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191
5.3.3.10. Операторы перехода break, continue и goto . . . . . . . . . . . . . . .191
5.3.3.11. Оператор throw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191
5.3.3.12. Оператор return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192
5.3.3.13. Оператор try-catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192
5.3.3.14. Оператор try-fnally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192
5.3.3.15. Оператор try-catch-finally. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .193
5.3.3.16. Оператор foreach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194
5.3.3.17. Оператор using . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194
5.3.3.18. Оператор lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194
5.3.3.19. Оператор yield . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194
5.3.3.20. Общие правила для простых выражений . . . . . . . . . . . . . . . . .195
5.3.3.21. Общие правила для выражений с вложенными
выражениями. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195
5.3.3.22. Выражения вызова и выражения создания объекта . . . . . . . .195
5.3.3.23. Выражения простого присваивания . . . . . . . . . . . . . . . . . . . . .196
5.3.3.24. &&-выражения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196
5.3.3.25. Выражения ||. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197
5.3.3.26. Выражения ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198
5.3.3.27. Выражения ?? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198
5.3.3.28. Выражения ?: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198
5.3.3.29. Анонимные функции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .199
5.4. Ссылки на переменные. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200
5.5. Атомарность ссылок на переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200
Глава 6. Приведение типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
6.1. Неявные приведения типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202
6.1.1. Тождественные преобразования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202
6.1.2. Неявные приведения арифметических типов . . . . . . . . . . . . . . . . . . . .203
6.1.3. Неявные приведения перечислений . . . . . . . . . . . . . . . . . . . . . . . . . . . .203
6.1.4. Неявные приведения обнуляемых типов . . . . . . . . . . . . . . . . . . . . . . . .204
6.1.5. Неявные приведения литерала null . . . . . . . . . . . . . . . . . . . . . . . . . . . . .205
6.1.6. Неявные приведения ссылочных типов . . . . . . . . . . . . . . . . . . . . . . . . .205
6.1.7. Преобразования упаковки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207
6.1.8. Неявные приведения типа dynamic . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207
6.1.9. Неявные приведения константных выражений . . . . . . . . . . . . . . . . . . .208
6.1.10. Неявные приведения параметров-типов . . . . . . . . . . . . . . . . . . . . . . .209
6.1.11. Определенные пользователем неявные приведения типов . . . . . . .210
6.1.12. Приведения анонимной функции и группы методов . . . . . . . . . . . . .210
6.2. Явные приведения типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .210
6.2.1. Явные приведения арифметических типов . . . . . . . . . . . . . . . . . . . . . .210
6.2.2. Явные приведения перечислений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .213
6.2.3. Явные приведения обнуляемых типов . . . . . . . . . . . . . . . . . . . . . . . . . .213
6.2.4. Явные приведения ссылочных типов . . . . . . . . . . . . . . . . . . . . . . . . . . .214
6.2.5. Преобразование распаковки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215
6.2.6. Явные приведения типа dynamic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .216
6.2.7. Явное приведение параметров-типов . . . . . . . . . . . . . . . . . . . . . . . . . .217
6.2.8. Определенные пользователем явные приведения типов . . . . . . . . . .218
6.3. Стандартные приведения типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .219
6.3.1. Стандартные неявные преобразования . . . . . . . . . . . . . . . . . . . . . . . . .219
6.3.2. Стандартные явные преобразования . . . . . . . . . . . . . . . . . . . . . . . . . . .219
6.4. Приведения типов, определенные пользователем . . . . . . . . . . . . . . . . . . . . .220
6.4.1. Допустимые приведения типов, определенные пользователем . . . .220
6.4.2. Повышающие (lifted) приведения типов . . . . . . . . . . . . . . . . . . . . . . . . .220
6.4.3. Выполнение определенных пользователем приведений . . . . . . . . . .221
6.4.4. Определенные пользователем неявные приведения типов . . . . . . . .222
6.4.5. Определенные пользователем явные приведения типов . . . . . . . . . .223
6.5. Приведения анонимных функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225
6.5.1. Выполнение приведений анонимных функций к типам делегатов. . .227
6.5.2. Выполнение приведений анонимных функций
к деревьям выражений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228
6.5.3. Пример реализации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228
6.6. Приведения групп методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .232
Глава 7. Выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
7.1. Классификация выражений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .236
7.1.1. Значение выражений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .238
7.2. Статическое и динамическое связывание. . . . . . . . . . . . . . . . . . . . . . . . . . . . .239
7.2.1. Время связывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240
7.2.2. Динамическое связывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240
7.2.3. Типы составных частей выражений . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242
7.3. Операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .243
7.3.1. Приоритет и ассоциативность операций . . . . . . . . . . . . . . . . . . . . . . . .243
7.3.2. Перегрузка операций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .245
7.3.3. Разрешение перегрузки унарных операций . . . . . . . . . . . . . . . . . . . . .247
7.3.4. Разрешение перегрузки бинарной операции . . . . . . . . . . . . . . . . . . . .247
7.3.5. Набор определенных пользователем операций . . . . . . . . . . . . . . . . . .248
7.3.6. Числовое расширение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .248
7.3.6.1. Унарное числовое расширение . . . . . . . . . . . . . . . . . . . . . . . . . .249
7.3.6.2. Бинарное числовое расширение . . . . . . . . . . . . . . . . . . . . . . . . .249
7.3.7. Расширенные операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .250
7.4. Поиск элемента . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .251
7.4.1. Базовые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .254
7.5. Функциональные элементы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .254
7.5.1. Списки аргументов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .257
7.5.1.1. Соответствующие параметры. . . . . . . . . . . . . . . . . . . . . . . . . . . .258
7.5.1.2. Вычисление списка аргументов во время выполнения
программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260
7.5.2. Выведение типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .262
7.5.2.1. Первая фаза. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264
7.5.2.2. Вторая фаза . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .265
7.5.2.3. Входные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .265
7.5.2.4. Выходные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .265
7.5.2.5. Зависимость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .265
7.5.2.6. Выведение выходного типа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .266
7.5.2.7. Явное выведение типа параметра . . . . . . . . . . . . . . . . . . . . . . . .266
7.5.2.8. Точное выведение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .266
7.5.2.9. Выведение нижней границы . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267
7.5.2.10. Выведение верхней границы . . . . . . . . . . . . . . . . . . . . . . . . . . .268
7.5.2.11. Фиксация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .269
7.5.2.12. Выведенный тип возвращаемого значения . . . . . . . . . . . . . . .270
7.5.2.13. Выведение типа для преобразования группы методов . . . . .271
7.5.2.14. Нахождение наилучшего общего типа для набора
выражений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272
7.5.3. Разрешение перегрузки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272
7.5.3.1. Подходящий функциональный элемент . . . . . . . . . . . . . . . . . . .273
7.5.3.2. Лучший функциональный элемент . . . . . . . . . . . . . . . . . . . . . . . .274
7.5.3.3. Лучшее приведение из выражения . . . . . . . . . . . . . . . . . . . . . . .276
7.5.3.4. Лучшее приведение из типа . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276
7.5.3.5. Лучший целевой объект приведения . . . . . . . . . . . . . . . . . . . . . .276
7.5.3.6. Перегрузка в обобщенных классах . . . . . . . . . . . . . . . . . . . . . . .277
7.5.4. Проверка динамического разрешения перегрузки во время
компиляции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .277
7.5.5. Вызов функционального элемента . . . . . . . . . . . . . . . . . . . . . . . . . . . . .278
7.5.5.1. Вызовы для упакованных экземпляров . . . . . . . . . . . . . . . . . . . .280
7.6. Первичные выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .280
7.6.1. Литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .281
7.6.2. Простые имена . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .281
7.6.2.1. Инвариантное значение в блоках . . . . . . . . . . . . . . . . . . . . . . . . .283
7.6.3. Выражения в скобках . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .285
7.6.4. Доступ к элементу . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .285
7.6.4.1. Идентичные простые имена и имена типов . . . . . . . . . . . . . . . .288
7.6.4.2. Грамматическая неоднозначность. . . . . . . . . . . . . . . . . . . . . . . .288
7.6.5. Выражения вызова. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289
7.6.5.1. Вызов метода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .290
7.6.5.2. Вызов метода расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .294
7.6.5.3. Вызов делегата . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .299
7.6.6. Доступ к элементу массива . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .299
7.6.6.1. Доступ к массиву. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300
7.6.6.2. Доступ к индексатору . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .301
7.6.7. this-доступ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .302
7.6.8. Base-доступ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .303
7.6.9. Постфиксные инкрементные и декрементные операции . . . . . . . . . .304
7.6.10. Операция new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .306
7.6.10.1. Выражения создания объекта. . . . . . . . . . . . . . . . . . . . . . . . . . .306
7.6.10.2. Инициализаторы объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308
7.6.10.3. Инициализаторы коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . .311
7.6.10.4. Выражения создания массива . . . . . . . . . . . . . . . . . . . . . . . . . .313
7.6.10.5. Выражения создания делегата. . . . . . . . . . . . . . . . . . . . . . . . . .315
7.6.10.6. Выражение создания анонимного объекта . . . . . . . . . . . . . . .317
7.6.11. Операция typeof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .319
7.6.12. Операции checked и unchecked . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .322
7.6.13. Выражения значений по умолчанию . . . . . . . . . . . . . . . . . . . . . . . . . . .325
7.6.14. Выражения анонимных методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .325
7.7. Унарные операции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .325
7.7.1. Унарная операция плюс . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .326
7.7.2. Унарная операция минус. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .326
7.7.3. Логическая операция отрицания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .327
7.7.4. Операция поразрядного дополнения . . . . . . . . . . . . . . . . . . . . . . . . . . .327
7.7.5. Префиксные инкрементные и декрементные операции . . . . . . . . . . .328
7.7.6. Выражения приведения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .329
7.8. Арифметические операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331
7.8.1. Операция умножения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331
7.8.2. Операция деления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333
7.8.3. Операция взятия остатка от деления . . . . . . . . . . . . . . . . . . . . . . . . . . .334
7.8.4. Операция сложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .336
7.8.5. Операция вычитания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .339
7.9. Операции сдвига . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .341
7.10. Операции отношения и операции проверки типа . . . . . . . . . . . . . . . . . . . . .342
7.10.1. Операции сравнения для целочисленных типов . . . . . . . . . . . . . . . . .343
7.10.2. Операции сравнения для типов с плавающей точкой . . . . . . . . . . . .344
7.10.3. Операции сравнения для десятичного типа . . . . . . . . . . . . . . . . . . . .346
7.10.4. Операции равенства для булевского типа . . . . . . . . . . . . . . . . . . . . . .346
7.10.5. Операции сравнения для перечислений . . . . . . . . . . . . . . . . . . . . . . .346
7.10.6. Операции равенства для ссылочных типов . . . . . . . . . . . . . . . . . . . . .347
7.10.7. Операции равенства для строкового типа . . . . . . . . . . . . . . . . . . . . . .349
7.10.8. Операции равенства для типов делегатов . . . . . . . . . . . . . . . . . . . . . .349
7.10.9. Операции равенства и константа null . . . . . . . . . . . . . . . . . . . . . . . . . .350
7.10.10. Операция is . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .350
7.10.11. Операция as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .351
7.11. Логические операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .353
7.11.1. Логические операции для целочисленных типов . . . . . . . . . . . . . . . .353
7.11.2. Логические операции для перечислений. . . . . . . . . . . . . . . . . . . . . . .354
7.11.3. Булевские логические операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .354
7.11.4. Обнуляемые булевские логические операции . . . . . . . . . . . . . . . . . .354
7.12. Условные логические операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .355
7.12.1. Булевские условные логические операции . . . . . . . . . . . . . . . . . . . . .356
7.12.2. Определенные пользователем условные логические операции . . .356
7.13. Операция объединения с нулем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .357
7.14. Условная операция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .359
7.15. Выражения анонимных функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .361
7.15.1. Сигнатуры анонимной функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .363
7.15.2. Тело анонимной функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .364
7.15.3. Разрешение перегрузки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .365
7.15.4. Анонимные функции и динамическое связывание . . . . . . . . . . . . . . .366
7.15.5. Внешние переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .366
7.15.5.1. Захваченные внешние переменные. . . . . . . . . . . . . . . . . . . . . .366
7.15.5.2. Инстанцирование локальных переменных . . . . . . . . . . . . . . . .367
7.15.6. Вычисление выражений анонимных функций . . . . . . . . . . . . . . . . . . .370
7.16. Выражения запроса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .370
7.16.1. Неоднозначность в выражениях запроса . . . . . . . . . . . . . . . . . . . . . . .372
7.16.2. Преобразование выражений запроса. . . . . . . . . . . . . . . . . . . . . . . . . .373
7.16.2.1. Конструкции select и GroupBy с продолжениями. . . . . . . . . . .374
7.16.2.2. Явно определенные типы переменных диапазона . . . . . . . . .375
7.16.2.3. Вырожденные выражения запросов . . . . . . . . . . . . . . . . . . . . .376
7.16.2.4. Конструкции from, let, where, join и orderby. . . . . . . . . . . . . . . .376
7.16.2.5. Конструкции select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .380
7.16.2.6. Конструкция GroupBy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .380
7.16.2.7. Прозрачные идентификаторы. . . . . . . . . . . . . . . . . . . . . . . . . . .380
7.16.3. Паттерн выражения запроса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .382
7.17. Операции присваивания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .384
7.17.1. Простое присваивание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .385
7.17.2. Сложное присваиваивание. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .388
7.17.3. Присваивание событий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .389
7.18. Выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .390
7.19. Константные выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .390
7.20. Булевские выражения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .392
Глава 8. Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
8.1. Конечные точки и достижимость. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .393
8.2. Блоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .396
8.2.1. Списки операторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .396
8.3. Пустой оператор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .397
8.4. Помеченные операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .399
8.5. Операторы объявления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .400
8.5.1. Объявление локальных переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . .400
8.5.2. Объявление локальных констант . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .403
8.6. Операторы-выражения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .404
8.7. Операторы выбора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .405
8.7.1. Оператор if. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .405
8.7.2. Оператор switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .406
8.8. Операторы цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .411.......