【问题标题】:Using Double.NaN in optional parameter on interface在接口的可选参数中使用 Double.NaN
【发布时间】:2011-06-09 10:41:18
【问题描述】:

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

以下代码在“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 中,或者是否有根本原因导致这是不可能的?

非常感谢, 柯林斯

【问题讨论】:

    标签: vb.net interface parameters nan optional


    【解决方案1】:

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

    您可以在 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 生成实现,否则它会变得很傻。

    【讨论】:

    • 谢谢汉斯,我发现 Positive 和 NegativeInfinity 也可以工作,但正如你所说,如果 IDE 执行任务则不行。我仍然很好奇是否存在任何对 NaN 正确的语法,或者更简单地说,如果原始语法是正确的并且 IDE 只是被错误地识别为错误。
    • Double.NaN 是正确的语法。由于编译器中的缺陷,它只是不起作用。这几乎肯定是由 NaN 的奇怪行为引起的:Double.NaN != Double.NaN。他们需要在编译器中对此进行特殊处理。 IDE 的奇怪行为是一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2017-10-18
    • 2020-09-14
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多