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. 你期望如果 BobSoftDeprecatedMethod从现在开始在任何地方打电话,他应该被警告,但他的代码应该仍然有效;它会的。

所以你得到你想要的!

于 2013-05-15T20:58:50.053 回答