使用[Obsolete]属性的弃用行为

时间:2013-05-15 19:30:21

标签: c# .net attributes

在删除一些过时的代码时,我遇到了一个意想不到的情况,重新创建如下:

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]属性实现中的缺陷?

1 个答案:

答案 0 :(得分:5)

事实上它是另一种方式:它表明C#编译器在使用标有Obsolete的方法时非常聪明且非常清楚。

假设您将此代码作为类库中的公共API提供给Bob。

  1. 你希望Bob在他的代码中调用HardDeprecatedMethod,他应该得到一个编译时错误;他会的。

  2. 你希望鲍勃在任何地方拨打SoftDeprecatedMethod,从这时起,他应该被警告,但他的代码应该仍然有用;它会。

  3. 所以你得到了你想要的东西!