1

VB アプリケーションでインターフェイスを定義しているときに、Visual Studio 2010 で何か紛らわしい、または潜在的なバグに遭遇しました。Double 型の既定のパラメーターを使用してインターフェイス メソッドを定義するときに、Double.NaN 定数を既定値として使用すると、コード エディターでエラーが発生します。 /intellisense/precompiler いくつかの問題。

次のコードは、"INaNTest" と "INaNTest.DoSomething" に下線を引いており、インターフェイス 'INaNTest' に一致するサブルーチンがないため、'DoSomething' は 'DoSomething' を実装できないと主張しています。

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" に下線が引かれ (Class 'NaNTest' must ...)、"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' は宣言されていません。保護レベルが原因でアクセスできない可能性があります。) コード エディターが無効なコードを再度挿入しました。

VB.net のインターフェイスで定義されているメソッドのデフォルト値として Double.NaN を使用する正しい解決策はありますか、それともこれが不可能な根本的な理由はありますか?

どうもありがとう、JCollins

4

1 に答える 1

1

うーん、それは醜いです。これをバグ以外のものとして特徴付けるのは難しいです。IDE にメソッド シグネチャを生成させるときの NaN の既定の書式設定は、VB.NET チームが使用する言語を示します。これは、C++ ランタイム ライブラリが NaN を書式設定する方法です。自分が何をしているのかを知っていると納得させようとする試みは、確かに無駄です。

これは、connect.microsoft.com で報告できます。「Visual Studio の次のバージョンで修正」が日の目を見るのを待つ間、回避策として null 許容型を使用することを検討してください。

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 に答える