Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

7.5.2Вывод типа

При вызове универсального метода без указания аргументов типа процесс вывода типа пытается определить аргументы типа для вызова. Наличие вывода типа позволяет использовать более удобный синтаксис для вызова универсального метода и позволяет разработчику избегать указания избыточных данных о типе. Например, при объявлении метода

class Chooser { static Random rand = new Random();

public static T Choose<T>(T first, T second) { return (rand.Next(2) == 0)? first: second; } }

можно вызвать метод Choose без явного указания аргумента типа:

int i = Chooser.Choose(5, 213); // Calls Choose<int>

string s = Chooser.Choose("foo", "bar"); // Calls Choose<string>

С помощью вывода типа аргументы типа int и string определяются из аргументов метода.

Вывод типа происходит при обработке вызова метода во время компиляции (§7.6.5.1) до этапа разрешения перегрузки для вызова. Когда в вызове метода указывается конкретная группа методов и не указываются аргументы типа, вывод типа применяется к каждому универсальному методу в группе методов. Если вывод типа завершается успехом, то полученные аргументы типа используются для определения типов аргументов для последующего разрешения перегрузки. Если при разрешении перегрузки выбирается вызов универсального метода, то при вызове в качестве фактических аргументов типа будут использоваться полученные аргументы. Если вывод типа для конкретного метода завершается неудачно, то такой метод не участвует в разрешении перегрузки. Ошибка при выводе типа сама по себе не приводит к ошибке времени привязки. Однако она часто приводит к ошибке времени привязки, когда при разрешении перегрузки не удается найти применимые методы.

Если предоставленное число аргументов отличается от числа параметров в методе, то вывод типа немедленно завершается ошибкой. Иначе предположим, что у универсального метода имеется следующая сигнатура

Tr M<X1…Xn>(T1 x1 … Tm xm)

При вызове метода в виде M(E1 …Em) задачей вывода типа является найти уникальные аргументы типа S1…Sn для каждого параметра типа X1…Xn, чтобы вызов M<S1…Sn>(E1…Em) оказался действительным.

Во время процесса вывода каждый параметр типа Xi либо фиксирован с определенным типом Si, либо нефиксирован со связанным набором границ. Каждая граница представляет собой некоторый тип T. Изначально каждая переменная типа Xi является нефикисированной с пустым набором границ.

Вывод типа происходит поэтапно. На каждом этапе выполняется попытка вывести аргументы типа для большего числа переменных типа на основании результатов предыдущего этапа. На первом этапе выводятся начальные границы, на втором этапе переменные связываются с определенными типами и выводятся дополнительные границы. Второй этап может потребоваться повторить несколько раз.

Обратите внимание: вывод типа происходит не только при вызове универсального метода. Вывод типа для преобразования групп методов описывается в разделе §7.5.2.13, а поиск самого подходящего общего типа для набора выражений описывается в разделе §7.5.2.14.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]