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

7.3.7Операторы с нулификацией

Операторы с нулификацией позволяют использовать стандартные и пользовательские операторы, применимые для необнуляемых типов значений, со значениями обнуляемых типов. Операторы с нулификацией создаются на основе стандартных и пользовательских операторов, которые соответствуют определенным требованиям, описанным ниже.

  • Для унарных операторов

+ ++ - -- ! ~

вариант оператора с нулификацией существует, если типы операнда и результата оба являются необнуляемыми типами значений. Вариант оператора с нулификацией создается с помощью добавления одного модификатора ? к типу операнда и результата. Значением оператора с нулификацией является значение null, если операнд равен null. В противном случае в операторе с нулификацией с операнда снимается упаковка, применяется базовый оператор и затем создается упаковка для результата.

  • Для бинарных операторов.

+ - * / % & | ^ << >>

вариант оператора с нулификацией существует, если типы операнда и результата являются необнуляемыми типами значений. Вариант оператора с нулификацией создается с помощью добавления одного модификатора ? к типу каждого операнда и результата. Значением оператора с нулификацией является значение null, если один или оба операнда равны null (исключение составляют операторы & и | типа bool?, см. раздел §7.11.3). В противном случае в операторе с нулификацией с операндов снимается упаковка, применяется базовый оператор и затем создается упаковка для результата.

  • Для операторов равенства

== !=

вариант оператора с нулификацией существует, если оба операнда имеют необнуляемый тип значений, а результат имеет тип bool. Вариант оператора с нулификацией создается с помощью добавления одного модификатора ? к каждому типу операнда. В операторе с нулификацией равными считаются два значения null, а неравными — значение null и любое другое ненулевое значение. Если оба операнда не равны null, то в операторе с нулификацией с операндов снимается упаковка и для получения результата с типом bool применяется базовый оператор.

  • Для операторов отношения

< > <= >=

вариант оператора с нулификацией существует, если оба операнда имеют необнуляемый тип значений, а результат имеет тип bool. Вариант оператора с нулификацией создается с помощью добавления одного модификатора ? к каждому типу операнда. Значением оператора с нулификацией является false, если один или оба операнда имеют значение null. В противном случае в операторе с нулификацией с операндов снимается упаковка и для получения результата с типом bool применяется базовый оператор.

7.4Поиск членов

Поиск членов — это процесс, при котором определяется значение имени в контексте данного типа. Поиск членов может выполняться в составе процесса вычисления простого_имени (§7.6.2) или доступа_к_члену (§7.6.4) в выражении. Если простое_имя или доступ_к_члену указывается в виде простого_выражения для выражения_вызова (§7.6.5.1), то говорят, что этот член вызываемый.

Если член является методом или событием или если он является константой, полем или свойством либо типа делегата (§15), либо типа dynamic (§4.7), то говорят, что этот метод допускает вызов.

При поиске членов учитывается не только имя члена, но также и число параметров типа, имеющихся у члена, а также, доступен ли член. Для поиска членов в универсальных методах и во вложенных универсальных методах в соответствующих объявлениях указывается определенное число параметров типа, а у всех остальных членов параметров типа нет.

Поиск члена с именем N и K параметрами типа в типе T происходит следующим образом.

  • Сначала определяется набор доступных членов с именем N.

  • Если T — это параметр типа, то такой набор представляет собой объединение наборов доступных членов с именем N из каждого типа, указанного в качестве первичного или вторичного ограничения (§10.1.5) для T, вместе с набором доступных членов с именем N в object.

  • В противном случае набор состоит из всех доступных членов (§3.5) с именем N в типе T, включая унаследованные члены и доступные члены с именем N в типе object. Если T — это сформированный тип, то набор членов получается заменой аргументов типа, как описано разделе в §10.3.2. Из набора исключаются члены с модификатором override.

  • Затем, если K равно нулю, удаляются все вложенные типы, в объявления которых входят параметры типа. Если K не равно нулю, удаляются все члены с отличающимся числом параметров типа. Обратите внимание, что когда K равно нулю, методы с параметрами типа не удаляются, поскольку в процессе определения типа (§7.5.2) могут выводиться аргументы типа.

  • Затем, если метод является вызываемым, из набора удаляются все не_допускающие_вызов члены.

  • Затем из набора удаляются члены, скрытые другими членами. Для каждого члена S.M в наборе, где S — это тип, в котором определен член M, применяются следующие правила.

  • Если M является константой, полем, свойством, событием или элементом перечисления, из набора удаляются все члены, объявленные в базовом типе S.

  • Если M является объявлением типа, из набора удаляются все объявленные в базовом типе S члены, не являющиеся типами, а также все объявления типов с таким же числом параметров типа, как и в M, объявленные в базовом типе S.

  • Если M является методом, то из набора удаляются все объявленные в базовом типе S члены, не являющиеся методами.

  • Затем из набора удаляются члены интерфейса, скрытые членами класса. Этот шаг выполняется, только если T является параметром типа и у T есть как действительный базовый класс, отличный от класса object, так и действительный непустой набор интерфейсов (§10.1.5). Для каждого члена S.M в наборе, где S — это тип, в котором определен член M, применяются следующие правила, если S является объявлением класса, отличного от object.

  • Если M является константой, полем, свойством, событием, элементом перечисления или объявлением типа, из набора удаляются все члены, объявленные в объявлении интерфейса.

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

  • Наконец, после удаления скрытых членов определяется результат поиска.

  • Если набор состоит из одного члена, который не является методом, то этот член является результатом поиска.

  • Иначе, если набор содержит только методы, то эта группа методов является результатом поиска.

  • Иначе поиск привел к неоднозначным результатам, что вызывает ошибку времени привязки.

При поиске членов в типах, отличных от параметров типа и интерфейсов, а также поиске членов в интерфейсах со строго единственным наследованием (каждый интерфейс в цепочке наследования имеет единственный непосредственный базовый интерфейс или не имеет такого) в результате применения правил поиска происходит простое скрытие базовых членов производными членами с такими же именами. При поиске в случае строго единственного наследования неоднозначности никогда не возникает. Случаи неоднозначности, которые могут возникать при поиске членов в случае с множественным наследованием, описываются в разделе §13.2.5.

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