【发布时间】:2019-03-17 19:35:53
【问题描述】:
我有一个接口I,我刚刚决定弃用方法OldMethod(因为它的名字很糟糕,因为我想要额外的参数,你来命名它)并建议我的库的用户使用NewMethod .因此,我将I 扩展如下:
Interface I
<Obsolete("Use NewMethod instead.")>
Sub OldMethod()
Sub NewMethod()
End Interface
但是,现在我所有的类实现 I 都会收到编译器警告:
Class C
Implements I
' The following line yields warning BC40000
Public Sub OldMethod() Implements I.OldMethod
Throw New NotImplementedException()
End Sub
Public Sub NewMethod() Implements I.NewMethod
Throw New NotImplementedException()
End Sub
End Class
这对我来说没有意义:要实现I(总体而言,它没有过时),我需要实现OldMethod . C# 中的相应代码编译得非常好,并且不会产生警告:
interface I
{
[Obsolete("Use NewMethod instead.")]
void OldMethod();
void NewMethod();
}
class Explicit : I
{
public void NewMethod() { throw new NotImplementedException(); }
public void OldMethod() { throw new NotImplementedException(); }
}
class Implicit : I
{
void I.NewMethod() { throw new NotImplementedException(); }
void I.OldMethod() { throw new NotImplementedException(); }
}
我知道我可以suppress the warning in VB,但通常编译器警告表明你正在做一些不应该以这种方式做的事情。
如何在 VB.NET 中实现带有过时成员的接口而不会收到过时警告?
【问题讨论】:
-
虽然很麻烦,但您可以通过在实现中添加相同的
Obsolete属性来删除警告。显然不理想 -
@AFriend:好点子!由于 C.OldMethod 不会“继承”过时的警告(因此,
myC.OldMethod()不会显示过时的警告,即使我想要它),这听起来像是正确的解决方案(正如语言所预期的那样设计师)。如果你回答这个问题,我会投赞成票! -
我所知道的是,在 VB.Net 项目文件
.vbproj中,您有硬编码的警告,将其视为<WarningsAsErrors>块中的错误和<NorWarn> </NorWarn>块以从警告中排除代码.在 csproj 中,您拥有(可能取决于开发偏好)<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>,它可能映射到不同的(托管)规则集。可能在 C# 项目上,已经运行了代码分析 + 抑制。或者规则设置不同(在Options/Performace Tools/Rules,这些规则是定义的)。