繁体   English   中英

如何在不抑制警告的情况下在VB.NET中使用过时的方法实现接口?

How do I implement an interface with an obsolete method in VB.NET without suppressing warnings?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个接口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(); }
}

我知道我可以在VB中抑制警告 ,但是,通常,编译器警告表明您正在做一些不应该以这种方式完成的事情。

如何在VB.NET中实现与过时成员的接口而不会得到过时的警告?

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

虽然与这个特定问题并不完全相关,但在研究时我发现Grant Winney的这篇博客文章解释了为什么在界面成员本身(以及实施成员)上标记过时成员是个好主意

1 抑制vb.net中工厂方法过时的警告

是否可以防止由静态工厂方法返回过时类的实例引起的编译器警告? 例如,如果通过静态方法(创建)创建了过时类(Foo)的实例,则工厂方法会引起编译器警告。 在C#中,可以使用“ #pragma warning ...”来抑制该警告,但我认为VB.Net中不存在该警告。 由于业务需求, ...

2 在VB.NET中抑制过时的警告

我使用过时的方法在Visual Studio 2008中使用VB.NET代码,并希望禁止警告。 不幸的是,遵循该建议并不是一个好的解决方案,因为它需要使用不同的类,这在不同的方面有重要作用。 我试图使用System.Diagnostics.CodeAnalysis.SuppressMes ...

7 在VB.NET中使用单个属性实现多个接口

在启动时,我将所有app.config值加载到名为ConfigValues的类中。 我的数据库只需要其中一些,所以我有一个IDatabaseConfig接口,只指定它需要的参数。 这样,当我使用构造函数注入创建数据库连接类时,我可以要求它传递任何实现IDatabaseConfig东西。 ...

8 接口方法使用ByRef和VB.NET实现和传递

我有一个C#接口定义如下: 我需要在VB.NET类中实现这个接口。 当我使用ByVal传递的items参数实现SetSecurityFlags方法时,它会编译。 当我尝试使用ByRef传递的items参数实现它时,我得到以下编译器错误: 类'UserRights'必须 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM