23

古いコードを削除しているときに、予期しないシナリオに遭遇しました。以下に再作成します。

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]属性の実装に欠陥がある可能性がありますか?

4

1 に答える 1

5

実際には逆です。C# コンパイラがスマートで、 でマークされたメソッドの使用が非常に明確であることを示していObsoleteます。

このコードをクラス ライブラリのパブリック API として Bob に提供するとします。

  1. Bob がHardDeprecatedMethod自分のコードを呼び出すと、コンパイル時エラーが発生するはずです。そして彼はそうするでしょう。

  2. ボブがSoftDeprecatedMethodどこかで電話をかけた場合、この時点以降、ボブはそれについて警告されるはずですが、彼のコードは引き続き機能するはずです。そしてそうなるでしょう。

だからあなたはまさにあなたが欲しいものを手に入れます!

于 2013-05-15T20:58:50.053 に答える