При удалении некоторого устаревшего кода я столкнулся с неожиданным сценарием, воссозданным ниже:
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]
?