Я наткнулся на пропущенное предупреждение при использовании функции сопоставления с образцом в 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;
        }
    }
}
0
ChristianMurschall 19 Авг 2019 в 15:42

2 ответа

Лучший ответ

Там может быть MyDoNothing с

internal class MyDoNothing : DoNothing, IAction {}

Это и DoNothing, и IAction, и поэтому они могут быть переданы в ваш Dispatch метод. Если вы закроете класс DoNothing, произойдет ошибка времени компиляции.

1
Dirk 19 Авг 2019 в 12:51

Каждое утверждение случая эквивалентно

if (action is SOMETHING)

Действие вполне может быть бездействием и следующим действием:

public DoNothingEx : DoNothing, IAction{}
1
Tim Rutter 19 Авг 2019 в 12:50