Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 145
- Предыдущая
- 145/642
- Следующая
Несмотря на то что сами вы можете выяснить, что ссылка
objectEmployee<i>(класс_к_которому_нужно_привести) существующая_ссылка</i>Таким образом, чтобы передать переменную типа
objectGivePromotion()// Правильно!GivePromotion((Manager)frank);Использование ключевого слова as
Имейте в виду, что явное приведение оценивается во время выполнения, а не на этапе компиляции. Ради иллюстрации предположим, что проект
EmployeesHexagonclass Hexagon{ public void Draw() { Console.WriteLine("Drawing a hexagon!"); }}Хотя приведение объекта сотрудника к объекту фигуры абсолютно лишено смысла, код вроде показанного ниже скомпилируется без ошибок:
// Привести объект frank к типу Hexagon невозможно,// но этот код нормально скомпилируется!object frank = new Manager();Hexagon hex = (Hexagon)frank;Тем не менее, вы получите ошибку времени выполнения, или более формально — исключение времени выполнения. В главе 7 будут рассматриваться подробности структурированной обработки исключений, а пока полезно отметить, что при явном приведении можно перехватывать возможные ошибки с применением ключевых слов
trycatch// Перехват возможной ошибки приведения.object frank = new Manager();Hexagon hex;try{ hex = (Hexagon)frank;}catch (InvalidCastException ex){ Console.WriteLine(ex.Message);}Очевидно, что показанный пример надуман; в такой ситуации вас никогда не будет беспокоить приведение между указанными типами. Однако предположим, что есть массив элементов
System.ObjectEmployeeEmployeeДля быстрого определения совместимости одного типа с другим во время выполнения в C# предусмотрено ключевое слово
asasnull// Использование ключевого слова as для проверки совместимости.object[] things = new object[4];things[0] = new Hexagon();things[1] = false;things[2] = new Manager();things[3] = "Last thing";foreach (object item in things){ Hexagon h = item as Hexagon; if (h == null) { Console.WriteLine("Item is not a hexagon"); // item - не Hexagon } else { h.Draw(); }}Здесь производится проход в цикле по всем элементам в массиве объектов и проверка каждого из них на совместимость с классом
HexagonDraw()HexagonИспользование ключевого слова is (обновление в версиях 7.0, 9.0)
В дополнение к ключевому слову
asisasisfalsenullGivePromotion()Employeestatic void GivePromotion(Employee emp){ Console.WriteLine("{0} was promoted!", emp.Name); if (emp is SalesPerson) { Console.WriteLine("{0} made {1} sale(s)!", emp.Name,- Предыдущая
- 145/642
- Следующая
