具有属性访问器的过时成员字段(Visual Studio错误)

时间:2015-02-24 13:13:49

标签: c# obsolete

我有一个类,我需要为遗留代码保留一个成员,我需要将其标记为过时,以便新代码不会使用它(不会收到警告)。

让我们说这堂课看起来像这样:

class MyClass
{
    [Obsolete]
    private string _old = "...";

    [Obsolete]
    public string Old
    {
        get { return _old; }
    }
}

我声明成员字段_old已过时,以确保类中的新代码不使用该字段。

我还声明属性Old已过时,以确保之外的代码不使用该属性。

当我编译它时,我在属性getter中收到一条警告,说_old已经过时了。我认为编译器会默默地忽略它,因为属性本​​身已经过时了。

我是否遗漏了某些内容,或者我是否需要在他们所使用的任何地方添加#pragma warning disable/restore过时的成员字段(即使方法/属性本身已标记为过时)?


" 的原因我认为编译器会默默地忽略这个"是因为它似乎对过时的类这样做:

[Obsolete]
public class MyObsoleteClass
{
    public string DoSomething()
    {
        // No warning here, since the class itself is obsolete
        return new MyClass().Old;
    }
}

正如@Heinzi所回答:这似乎是由于Visual Studio中的一个错误。我已经就连接提交了一份报告:

https://connect.microsoft.com/VisualStudio/feedback/details/1146809


事实证明,Visual Studio中的错误不仅限于从属性访问过时的字段。

从过时的方法访问过时的属性不应该产生警告:

public class Class2
{
    [Obsolete]
    public string Property { get; set; }

    [Obsolete]
    public void Method()
    {
        this.Property = "value"; // <-- Incorrect warning reported
    }
}

也不应该从另一个班级这样做:

public class Class3
{
    [Obsolete]
    public string Property { get; set; }
}

public class Class4
{
    [Obsolete]
    public string Method()
    {
        return new Class3().Property; // <-- Incorrect warning reported
    }
}

有趣的是,它适用于以下类,当添加此类时,其他警告(来自Class4Class2)将会神奇地消失。

public class Class5
{
    [Obsolete]
    public void Method()
    {
        // No warning reported here, which is good.
        // This magically makes the other warnings disappear too!
        new Class2().Method();
    }
}

2 个答案:

答案 0 :(得分:2)

您的代码很好,您对Obsolete属性应如何工作的理解是正确的:如果您查看&#34;输出&#34;编译后的选项卡,您会注意到编译器不会为您的案例输出警告(但如果从您的案例中删除Obsolete属性,输出警告财产,如预期的那样。)

但是,你是对的,Visual Studio有时会在对代码进行任意更改后显示警告。这似乎是Visual Studio中的一个错误。如果您仍然可以使用最新版本重现它,我建议您在http://connect.microsoft.com上提交错误报告。

答案 1 :(得分:0)

这将是一个聪明的功能,但我没有在文档中看到它 以这种方式工作的任何迹象。另一方面,我不会在私有成员上使用Obsolate属性(如果类不是极其庞大),但我会重构它。我是你的情况我会写这个:

class MyClass
{
    [Obsolete]
    public string Old
    {
        get; private set;
    }
}

然后您只需要将_old的用法更改为Old,问题就解决了。