Такое условие будет давать совпадение с чем угодно, а потому следует уделять внимание порядку, в котором используется блок сравнения с отбрасыванием. Ниже показан обновленный метод GivePromotion()
if (emp is SalesPerson s)
{
Console.WriteLine("{0} made {1} sale(s)!", s.Name, s.SalesNumber);
Console.WriteLine();
}
// Если Manager, тогда присвоить переменной m
else if (emp is Manager m)
{
Console.WriteLine("{0} had {1} stock options...", m.Name, m.StockOptions);
Console.WriteLine();
}
else if (emp is var _)
{
// Некорректный тип сотрудника
Console.WriteLine("Unable to promote {0}. Wrong employee type", emp.Name);
Console.WriteLine();
}
Финальный оператор if
Employee
, не являющийся Manager
, SalesPerson
или PtSalesPerson
. Не забывайте, что вы можете приводить вниз к базовому классу, поэтому PtSalesPerson
будет регистрироваться как SalesPerson
.Еще раз о сопоставлении с образцом (нововведение в версии 7.0)
В главе 3 было представлено средство сопоставления с образцом C# 7.0 наряду с его обновлениями в версии C# 9.0. Теперь, когда вы обрели прочное понимание приведения, наступило время для более удачного примера. Предыдущий пример можно модернизировать для применения оператора switch
static void GivePromotion(Employee emp)
{
Console.WriteLine("{0} was promoted!", emp.Name);
switch (emp)
{
case SalesPerson s:
Console.WriteLine("{0} made {1} sale(s)!", emp.Name,
s.SalesNumber);
break;
case Manager m:
Console.WriteLine("{0} had {1} stock options...",
emp.Name, m.StockOptions);
break;
}
Console.WriteLine();
}
Когда к оператору case
when
, для использования доступно полное определение объекта SalesNumber
существует только в классе SalesPerson
, но не в классе Employee
. Если приведение в первом операторе case
проходит успешно, то переменная s
будет содержать экземпляр класса SalesPerson
, так что оператор case
можно было бы переписать следующим образом:case SalesPerson s when s.SalesNumber > 5:
Такие новые добавления к is
switch
обеспечивают удобные улучшения, которые помогают сократить объем кода, выполняющего сопоставление, как демонстрировалось в предшествующих примерах.Использование отбрасывания вместе с операторами switch (нововведение в версии 7.0)
Отбрасывание также может применяться в операторах switch
switch (emp)
{
case SalesPerson s when s.SalesNumber > 5:
Console.WriteLine("{0} made {1} sale(s)!", emp.Name,
s.SalesNumber);
break;
case Manager m:
Console.WriteLine("{0} had {1} stock options...",
emp.Name, m.StockOptions);
break;
case Employee _:
// Некорректный тип сотрудника
Console.WriteLine("Unable to promote {0}. Wrong employee type", emp.Name);
break;
}
Каждый входной тип уже является Employee
case
всегда дает true
. Однако, как было показано при представлении сопоставления с образцом в главе 3, после сопоставления оператор switch
завершает работу Это демонстрирует важность правильности порядка. Если финальный оператор case
переместить в начало, тогда никто из сотрудников не получит повышения.Главный родительский класс: System.Object
В заключение мы займемся исследованием главного родительского класса Object
Car
, Shape
, Employee
) никогда явно не указывали свои родительские классы:// Какой класс является родительским для Car?
class Car
{...}