古いコードを削除しているときに、予期しないシナリオに遭遇しました。以下に再作成します。
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()
fromの呼び出しSoftDeprecatedMethod()
が許可されていないことを示すコンパイラ エラーが表示されることを期待していました。観察された動作は私には奇妙に思えます。
これが望ましい動作であるかどうか (もしそうなら、その理由) を知っている人はいますか? または、[Obsolete]
属性の実装に欠陥がある可能性がありますか?