1

在我的 VB 应用程序中定义接口时,我在 Visual Studio 2010 中遇到了一些令人困惑或可能存在的错误:使用 Double 类型的默认参数定义接口方法时,使用 Double.NaN 常量作为默认值会导致代码编辑器/intellisense/precompiler 一些问题。

以下代码在“INaNTest”和“INaNTest.DoSomething”下划线,声称“DoSomething”无法实现“DoSomething”,因为接口“INaNTest”上没有匹配的子:

Public Class NaNTest
    Implements INaNTest
    Public Sub DoSomething(ByVal x As Double,
                           Optional ByVal a As Double = Double.NaN)
                           Implements INaNTest.DoSomething
    End Sub
End Class

Public Interface INaNTest
    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double = Double.NaN)
End Interface

删除实现并从以下位置开始:

Public Class NaNTest
    Implements INaNTest
End Class

Public Interface INaNTest
    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double = Double.NaN)
End Interface

现在“NaNTest”被加下划线(类“NaNTest”必须......),在“Implements INaNTest”行的末尾点击返回键(即自动插入实现)添加实现:

    Public Sub DoSomething(ByVal x As Double,
                           Optional ByVal a As Double = -1.#IND)
                           Implements INaNTest.DoSomething

    End Sub

然后代码编辑器在其中加下划线“#”(应为标识符。)。因此代码自动添加了不正确的代码。

或者现在,从上面的原始代码开始,使用带下划线的“INaNTest.DoSomething”上的“错误纠正选项”按钮,并在“INaNTest”中选择“为“DoSomething”生成方法存根,添加的方法存根是:

    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double = NaN)

现在“NaN”已经与“Double”分离了。前缀和下划线(未声明“NaN”。由于其保护级别,它可能无法访问。)代码编辑器再次插入了无效代码。

是否有使用 Double.NaN 作为在接口上定义的方法的默认值的正确解决方案,在 VB.net 中,或者是否有根本原因导致这是不可能的?

非常感谢,JCollins

4

1 回答 1

1

呃,太丑了。很难将此描述为除错误之外的任何内容。当您让 IDE 生成方法签名时,NaN 的默认格式显示 VB.NET 团队使用的语言,这就是 C++ 运行时库格式化 NaN 的方式。试图说服它你知道你在做什么确实是徒劳的,afaict。

您可以在 connect.microsoft.com 上报告此情况。当您等待“在下一版本的 Visual Studio 中修复”出现时,您可能会考虑使用可为空的类型作为解决方法:

Public Class NaNTest
    Implements INaNTest
    Public Sub DoSomething(ByVal x As Double, Optional ByVal a As Double? = Nothing) Implements INaNTest.DoSomething
        If a.HasValue Then
            '' etc..
        End If
    End Sub
End Class

Public Interface INaNTest
    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double? = Nothing)
End Interface

Fwiw,当您使用 Double.Epsilon 作为默认值时,它确实有效。有点傻,但也不是完全不合理的解决方法。只是不要让 IDE 生成实现,然后它就会变得愚蠢。

于 2011-01-14T22:35:06.673 回答