Подтвердить что ты не робот

Поведение устаревания с использованием атрибута [Устаревший]

При удалении некоторого устаревшего кода я столкнулся с неожиданным сценарием, воссозданным ниже:

class Program
{
    static void Main(string[] args)
    {
        ViableMethod();
        Console.WriteLine("");    
        SoftDeprecatedMethod();//Compiler warning

        //HardDeprecatedMethod();//Can't call that from here, compiler error

        Console.ReadKey(true);
    }

    public static void ViableMethod ()
    {
        Console.WriteLine("ViableMethod, calls SoftDeprecatedMethod");
        SoftDeprecatedMethod();//Compiler warning
        //HardDeprecatedMethod();//Can't call that from here, compiler error
    }

    [Obsolete("soft", false)]
    public static void SoftDeprecatedMethod()
    {
        Console.WriteLine("SoftDeprecatedMethod, calls HardDeprecatedMethod");
        HardDeprecatedMethod();
    }

    [Obsolete("hard", true)]
    public static void HardDeprecatedMethod()
    {
        Console.WriteLine("HardDeprecatedMethod");
    }
}

В результате на выходе кажется, что функции, устаревшие с предупреждением, разрешают вызывать функции, устаревшие с ошибкой, и код будет выполнен.

Я ожидал, что я увижу ошибку компилятора, жалующуюся на то, что вызов HardDeprecatedMethod() из SoftDeprecatedMethod() не разрешен. Наблюдаемое поведение кажется мне странным.

Кто-нибудь знает, является ли это желаемым поведением (и если да, почему), или это может быть недостатком в реализации атрибута [Obsolete]?

4b9b3361

Ответ 1

В действительности это наоборот: он показывает, что компилятор С# является умным и очень понятным в использовании методов, отмеченных Obsolete.

Предположим, что вы предоставляете этот код в качестве открытого API в библиотеке классов для Боба.

  • Вы ожидаете, если Боб называет HardDeprecatedMethod в своем коде, он должен получить ошибку времени компиляции; и он будет.

  • Вы ожидаете, что если Боб вызвал SoftDeprecatedMethod в любом месте, с этого времени вперед, его следует предупредить об этом, НО его код все равно должен работать; и он будет.

Итак, вы получаете то, что хотите!