Операторы проверки типа и выражения приведения (справочник по 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#: