Я наткнулся на пропущенное предупреждение при использовании функции сопоставления с образцом в C #. Обычно компилятор очень умен для обнаружения недоступного кода, поэтому мне интересно, почему это не сгенерирует предупреждение:
internal interface IAction{}
internal class Increment : IAction{}
internal class Decrement : IAction{}
internal class DoNothing{}
internal class Program
{
private static void Main(string[] args)
{
// obviously the following will not compile:
// Console.Write(Dispatch(5, new DoNothing()));
Console.Write(Dispatch(5, new Increment()));
}
private static int Dispatch(int value, IAction action)
{
switch (action)
{
case Increment _:
return value + 1;
case Decrement _:
return value - 1;
case DoNothing _: // Not an IAction, will never happen, but no warning is generated
return value;
default:
return value;
}
}
}
2 ответа
Там может быть MyDoNothing
с
internal class MyDoNothing : DoNothing, IAction {}
Это и DoNothing
, и IAction
, и поэтому они могут быть переданы в ваш Dispatch
метод. Если вы закроете класс DoNothing
, произойдет ошибка времени компиляции.
Каждое утверждение случая эквивалентно
if (action is SOMETHING)
Действие вполне может быть бездействием и следующим действием:
public DoNothingEx : DoNothing, IAction{}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.