2011-01-14 5 views
1

私はVBアプリケーションでインターフェイスを定義するときに、Visual Studio 2010で混乱しているか、または潜在的にバグに遭遇しました。デフォルト値としてのDouble.NaN定数は、コードエディタ/ intellisense/precompilerにいくつかの問題を引き起こします。インターフェイスのオプションパラメータで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 

実装の取り外しと始まる:今すぐ「NaNTestは」ライン「INaNTestを実装」の最後にリターンキーを押す、(クラスのNaNTest "しなければならない...)下線が引かれているところ

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 

(すなわち、自動的に実装挿入)を追加します実装:

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

    End Sub 

コードエディタは、 '#'(識別子が必要です)に下線を引いています。したがって、コードは自動的に正しくないコードを追加しました。

また、上記の元のコードから、下線付きの "INaNTest.DoSomething"のError Correction Optionsボタンを使用して、 "INaNTest"で "DoSomething"のメソッドスタブを生成すると、追加されたメソッドスタブは

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

ここで、「NaN」は「Double」から離婚しました。接頭辞とアンダーライン( 'NaN'は宣言されていません。保護レベルのためにアクセスできない可能性があります)。コードエディタで無効なコードが再度挿入されました。

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

多くのおかげで、 JCollins

答えて

1

うわ、それは非常に醜いです。これをバグ以外のものとして特定するのは難しいです。 IDEにメソッドシグネチャを生成させるときのNaNのデフォルトの書式設定は、VB.NETチームがどの言語を使用するかを示しています。これは、C++ランタイムライブラリがNaNをフォーマットする方法です。あなたが何をしているのかを確信させようとする試みは、本当に無益で、辛辣なものです。

これはconnect.microsoft.comで報告できます。

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あなたがダブルを使用する場合、それ作業を行います。あなたは、日の光を見るために「のVisual Studioの次期バージョンで修正」、あなたは回避策としてNULL可能なタイプを使用して検討するかもしれないのを待ちながらデフォルト値として.Epsilon。愚かなことですが、まったく不合理な回避策でもありません。 IDEが実装を生成させないようにしてください。それがばかげてしまいます。

+0

ありがとう、私は、PositiveとNegativeInfinityが両方とも機能することを発見しました。しかし、あなたが言うように、IDEがタスクを実行する場合はそうではありません。 NaNに正しい構文が存在するかどうか、あるいは元の構文が正しく、IDEが間違ってエラーと誤って識別された場合には、もっと興味があります。 –

+0

Double.NaNは正しい構文です。コンパイラの欠陥のせいで動作しません。これはNaNの奇妙な振る舞いによってほぼ確実に引き起こされます:Double.NaN!= Double.NaN。彼らはコンパイラで特別なケースが必要です。 IDEの奇妙な動作は別の問題です。 –