Имейте в виду, что явное приведение оценивается
Employees содержит копию класса Hexagon, созданного ранее в главе. Для простоты вы можете добавить в текущий проект такой класс:class Hexagon
{
public void Draw
{
Console.WriteLine("Drawing a hexagon!");
}
}
Хотя приведение объекта сотрудника к объекту фигуры абсолютно лишено смысла, код вроде показанного ниже скомпилируется без ошибок:
// Привести объект frank к типу Hexagon невозможно,
// но этот код нормально скомпилируется!
object frank = new Manager;
Hexagon hex = (Hexagon)frank;
Тем не менее, вы получите ошибку времени выполнения, или более формально —
try и catch:// Перехват возможной ошибки приведения.
object frank = new Manager;
Hexagon hex;
try
{
hex = (Hexagon)frank;
}
catch (InvalidCastException ex)
{
Console.WriteLine(ex.Message);
}
Очевидно, что показанный пример надуман; в такой ситуации вас никогда не будет беспокоить приведение между указанными типами. Однако предположим, что есть массив элементов System.Object
Employee. В этом случае первым делом желательно определить, совместим ли элемент массива с типом Employee, и если да, то лишь тогда выполнить приведение.Для быстрого определения совместимости одного типа с другим во время выполнения в C# предусмотрено ключевое слово as
as можно определить совместимость, проверив возвращаемое значение на предмет null. Взгляните на следующий код:// Использование ключевого слова 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;
}
}
Здесь производится проход в цикле по всем элементам в массиве объектов и проверка каждого из них на совместимость с классом Hexagon
Draw вызывается, если (и только если) обнаруживается объект, совместимый с Hexagon. В противном случае выводится сообщение о том, что элемент несовместим.Использование ключевого слова is (обновление в версиях 7.0, 9.0)
В дополнение к ключевому слову as
is, предназначенное для определения совместимости типов двух элементов. Тем не менее, в отличие от ключевого слова as, если типы не совместимы, тогда ключевое слово is возвращает false, а не ссылку null. В текущий момент метод GivePromotion спроектирован для приема любого возможного типа, производного от Employee. Взгляните на следующую его модификацию, в которой теперь осуществляется проверка, какой конкретно "тип сотрудника" был передан:static void GivePromotion(Employee emp)
{
Console.WriteLine("{0} was promoted!", emp.Name);
if (emp is SalesPerson)
{
Console.WriteLine("{0} made {1} sale(s)!", emp.Name,
((SalesPerson)emp).SalesNumber);
Console.WriteLine;
}
else if (emp is Manager)
{
Console.WriteLine("{0} had {1} stock options...", emp.Name,
((Manager)emp).StockOptions);
Console.WriteLine;
}
}
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT