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

Mår*_*röm 5 c# obsolete

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

让我们说这个类看起来像这样:

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

    [Obsolete]
    public string Old
    {
        get { return _old; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我声明成员字段_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;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如@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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

有趣的是,它适用于以下类,当添加此类时,其他警告(来自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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 3

您的代码很好,并且您对Obsolete属性应如何工作的理解是正确的:如果您在编译后查看“输出”选项卡,您会注意到编译器不会针对您的情况输出警告(但如果正如预期的那样,您Obsolete从属性中删除了该属性)。

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

  • 我已经检查了命令行编译器“csc”。那里没有收到任何警告。所以就像你说的那样,这似乎是 Visual Studio 中的一个错误。 (2认同)