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

7.10.7Операторы равенства строк

К стандартным операторам равенства строк относятся:

bool operator ==(string x, string y);

bool operator !=(string x, string y);

Два значения типа string считаются равными, когда истинно одно из следующих условий:

  • оба значения равны null;

  • оба значения являются непустыми ссылками на экземпляры строк с одинаковой длиной и идентичными символами в каждой позиции.

Операторы равенства строк сравнивают значения строк, а не ссылки на строки. Когда два разных экземпляра строк содержат одинаковую последовательность символов, значения строк равны, но ссылки отличаются. Как описано в разделе §7.10.6, для сравнения ссылок на строки вместо строковых значений можно использовать операторы равенства значений ссылочного типа.

7.10.8Операторы равенства делегатов

Каждый тип делегата неявно предоставляет следующие стандартные операторы сравнения:

bool operator ==(System.Delegate x, System.Delegate y);

bool operator !=(System.Delegate x, System.Delegate y);

Два делегата считаются равными, если выполняется одно из следующих условий.

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

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

  • Если у обоих экземпляров делегата есть список вызова (§15.1), то они равны, только если их списки вызова имеют одну длину и каждая запись в списке вызова одного делегата равна (в соответствии с определением ниже) соответствующей записи по порядку в списке вызова другого делегата.

Равенство записей списка вызова определяется следующими правилами.

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

  • Если две записи списка вызова ссылаются на один нестатический метод одного целевого объекта (определяется операторами равенства ссылочных значений), то записи равны.

  • Записи списка вызова, полученные при вычислении семантически идентичных выражений_анонимных_функций с одинаковым (возможно пустым) набором захваченных внешних экземпляров переменных могут (но не обязательно) быть равны.

7.10.9Операторы равенства и значение null

Операторы == и!= допускают, что один операнд был значением обнуляемого типа, а второй литералом null, даже если для операции не существует стандартного или пользовательского оператора (обычного или с нулификацией).

Для операции одного из видов

x == null null == x x != null null != x

где x является выражением обнуляемого типа, если при разрешении перегрузки операторов (§7.2.4) не удается найти применимый оператор, то результат вычисляется на основании свойства HasValue для x. В частности, первые два вида операции преобразуются в !x.HasValue а два последних типа преобразуются в x.HasValue.

7.10.10Оператор is

Оператор is используется для динамической проверки, можно ли сравнивать тип объекта во время выполнения с указанным типом. Результат операции E is T, где E — это выражение, а T — тип, является логическим значением, которое указывает, можно ли провести преобразование E в тип T с помощью преобразования ссылки, преобразования упаковки или преобразования отмены упаковки. После замены всех параметров типа на аргументы типа операция вычисляется следующим образом.

  • Если E является анонимной функцией, возникает ошибка времени компиляции

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

  • Иначе пусть D обозначает динамический тип E следующим образом.

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

  • Если E имеет обнуляемый тип, D является базовым типом этого обнуляемого типа.

  • Если E имеет необнуляемый тип значения, D имеет тип E.

  • Результат операции зависит от D и T следующим образом.

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

  • Если T имеет обнуляемый тип, результат равен true, если D является базовым типом T.

  • Если T является необнуляемым типом значения, результат равен true, если T и D имеют одинаковый тип

  • Иначе результат равен false.

Обратите внимание, что пользовательские преобразования в операторе is не учитываются.

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