我有一个类,我需要为遗留代码保留一个成员,我需要将其标记为过时,以便新代码不使用它(不会收到警告).
让我们说这个类看起来像这样:
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)
有趣的是,它适用于以下类,当添加此类时,其他警告(来自Class4和Class2)将神奇地消失.
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)
您的代码很好,并且您对Obsolete属性应如何工作的理解是正确的:如果您在编译后查看“输出”选项卡,您会注意到编译器不会针对您的情况输出警告(但如果正如预期的那样,您Obsolete从属性中删除了该属性)。
不过,您是对的,Visual Studio 有时在对代码进行任意更改后会显示警告。这似乎是 Visual Studio 中的一个错误。如果您仍然可以使用最新版本重现它,我建议您在http://connect.microsoft.com上提交错误报告。