Операторы проверки типа и выражения приведения (справочник по C#)

Операторы проверки типа и выражения приведения (справочник по C#)

Чтобы выполнить проверку или преобразование типов, можно использовать следующие операторы и выражения:

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

Оператор is

Оператор is проверяет, совместим ли тип среды выполнения результата определенного выражения с указанным типом. Начиная с версии C# 7.0, оператор is также проверяет соответствие результата выражения указанному шаблону.

Выражение с оператором проверки типа is имеет следующий вид:

где E представляет выражение, возвращающее значение, а T содержит имя или параметр типа. E не может использоваться как анонимный метод или лямбда-выражение.

Оператор is возвращает true , если результат выражения имеет значение, отличное от NULL, и выполняется любое из следующих условий.

Тип результата выражения в среде выполнения — T .

Тип результата выражения в среде выполнения является производным от типа T , реализует интерфейс T или существует другое T из него в T .

Тип результата выражения в среде выполнения является типом, допускающим значение NULL, имеющим базовый тип , а Nullable<T>.HasValue — true .

Существует упаковка-преобразование или распаковка-преобразование из типа результата выражения в среде выполнения в тип .

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

В следующем примере показано, что оператор is возвращает true , если тип результата выражения в среде выполнения является производным от указанного типа, то есть между этими типами существует преобразование ссылки:

В следующем примере показано, что оператор is учитывает упаковку-преобразование и распаковку-преобразование, но не учитывает is :

Дополнительные сведения о преобразованиях в C# см. в главе о преобразованиях в спецификации по языку C#.

Тестирование типов с сопоставлением шаблонов

Начиная с версии C# 7.0, оператор is также проверяет соответствие результата выражения указанному шаблону. В следующем примере показано, как использовать шаблон объявления для проверки типа выражения в среде выполнения:

Дополнительные сведения о поддерживаемых шаблонах см. в разделе Шаблоны.

Оператор as

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

Выражение имеет такой формат:

где E представляет выражение, возвращающее значение, а T содержит имя или параметр типа. Результат такого выражения аналогичен результату этого:

за исключением того, что E вычисляется только один раз.

Оператор as рассматривает только преобразование ссылки, допускающие значение NULL преобразования, упаковку-преобразование и распаковку-преобразование. Оператор as нельзя использовать для определенного пользователем преобразования. Для этого используйте выражение приведения.

В следующем примере иллюстрируется использование оператора as .

Как показано в примере выше, нужно сравнить результат выражения as со значением null , чтобы проверить, успешно ли выполнено преобразование. Начиная с версии C# 7.0, вы можете использовать оператор is как для проверки успешного выполнения преобразования, так и для сохранения результата в переменной, если преобразование выполнено успешно.

Выражение приведения

Выражение приведения в формате (T)E выполняет явное преобразование значения выражения E в тип T . Если явного преобразования из типа E в тип T не существует, возникает ошибка времени компиляции. Во время выполнения явное преобразование может завершиться сбоем, и выражение приведения может вызвать исключение.

Приведенный ниже пример демонстрирует явное числовое преобразование и преобразование ссылки:

Сведения о поддерживаемых явных преобразованиях см. в разделе о явных преобразованиях в спецификации по языку C#. Сведения о том, как определять пользовательские операторы явного или неявного преобразования, см. в разделе Операторы пользовательского преобразования.

Другие данные об использовании ()

Кроме того, с помощью круглых скобок можно настраивать порядок выполнения операций в выражении. Дополнительные сведения см. в разделе Операторы C#.

typeof - оператор

Оператор typeof получает экземпляр System.Type для указанного типа. Оператор typeof принимает в качестве аргумента имя типа или параметр типа, как показано в следующем примере:

Аргумент не должны должен быть типом, требующим заметок к метаданным. Далее приведены примеры типов.

  • dynamic
  • string? (или любой ссылочный тип, допускающий значение NULL)

Эти типы не представлены непосредственно в метаданных. Типы включают в себя атрибуты, описывающие базовый тип. В обоих случаях можно использовать базовый тип. Вместо dynamic можно использовать object . Вместо string? можно использовать string .

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

Оператор typeof не может принимать выражение в качестве аргумента. Чтобы получить экземпляр System.Type для типа среды выполнения результата выражения, используйте метод Object.GetType.

Тестирование типов с оператором typeof

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

Возможность перегрузки оператора

Операторы is , as и typeof перегрузить нельзя.

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

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

📎📎📎📎📎📎📎📎📎📎