【问题标题】:How do I implement an interface with an obsolete method in VB.NET without suppressing warnings?如何在 VB.NET 中使用过时的方法实现接口而不抑制警告?
【发布时间】: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 中,您有硬编码的警告,将其视为 &lt;WarningsAsErrors&gt; 块中的错误和 &lt;NorWarn&gt; &lt;/NorWarn&gt; 块以从警告中排除代码.在 csproj 中,您拥有(可能取决于开发偏好)&lt;CodeAnalysisRuleSet&gt;MinimumRecommendedRules.ruleset&lt;/CodeAnalysisRuleSet&gt;,它可能映射到不同的(托管)规则集。可能在 C# 项目上,已经运行了代码分析 + 抑制。或者规则设置不同(在Options/Performace Tools/Rules,这些规则是定义的)。

标签: vb.net interface obsolete


【解决方案1】:

从我的评论中充实这个答案。

实现类必须实现Obsolete成员来履行契约,但是当接口方法被标记为Obsolete时你还必须标记对应的方法作为Obsolete 来满足编译器不使用Obsolete 成员的实现。

Public Interface I
    <Obsolete("Use NewMethod instead.")>
    Sub OldMethod() 
    Sub NewMethod()
End Interface

Public Class C
    Implements I

    <Obsolete("Use NewMethod instead.")>
    Public Sub OldMethod() Implements I.OldMethod ' No warning
        Throw New NotImplementedException()
    End Sub

    Public Sub NewMethod() Implements I.NewMethod
        Throw New NotImplementedException()
    End Sub
End Class

虽然与这个特定问题并不完全相关,但在研究过程中我发现blog post by Grant Winney 解释了为什么在接口成员本身(以及实现成员)上标记过时的成员是个好主意

【讨论】:

  • 我认为这篇博文的分析有点偏离目标。通过接口调用时不会出现警告,因为您调用的对象的静态类型是接口的类型,而过时的警告是基于被调用方法的静态类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2020-03-09
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多