質問

プロジェクト(IComparableのテンプレートメソッドが数回使用された)をVS 2005からVS 2008に変換すると、エラーが発生します:

Error 12 Type argument 'Object' does not inherit from or implement 
the constraint type 'System.IComparable'.

これは、System.Objectがそのインターフェイスを実装しなくなったという実際の事実ですか、または変換中に何かが間違っていましたか?これをどうにかして修正できますか?

問題は次の方法にあります:

Public Function ValueIn(Of T As IComparable)(ByVal pValue As T, ByVal ParamArray pArgs() As T) As Boolean
    For Each MyArg As T In pArgs
        If pValue.CompareTo(MyArg) = 0 Then
            Return True
        End If
    Next
    Return False
End Function

さらには次のような単純なものでも:

Dim a as Object = 1
ValueIn(a,1,2)

上記のエラーが発生します。 VS 2005では完全に機能したので、今何が問題なのでしょうか?

役に立ちましたか?

解決

編集: VS 2005と2008の両方でコードを試しました。

プロジェクトまたはソースコードファイルで Option Strict Off が設定されています。コードはそもそも機能しませんでした。VS2005で Option Strict On を設定すると、エラーの実際の原因が表示されます。 '"。すべてのVB.NETコードで Option Strict On を使用することをお勧めします。

VS 2008では新しいバージョンの言語を使用しているため、オーバーロードと型推論のルールが大きく異なるため、VS 2008では別のエラーが表示されます。 VB.NET 2008では、コンパイラは Option Strict がオンかオフかに関係なくメソッド呼び出しを解決できません。

System.Object タイプは、インターフェースを実装していませんし、実装したこともありません。

VS 2008の Option Infer の設定は、推論された型を使用しないため、コードには関係ありません。

両方のIDEのエラーを修正する最も簡単な方法は、呼び出しコードを次のように変更することです。

    Dim a As Integer = 1
    ValueIn(a, 1, 2)

他のヒント

Visual Studio 2005でコードのデバッグを実行すると、「from from」が表示されます

Dim a as Object = 1

は整数ですが、2008を使用する場合はオブジェクトであると表示されます。

Integerには、IComparableインターフェイスが含まれていますが、Objectはありません。 じゃあ何をすればいいの? 回答:プロジェクトのプロパティ(プロジェクト名を右クリックしてプロパティを選択)を取得し、「コンパイル」の下に移動すると、2005年のInferという名前の新しいフィールドである明示的、厳密、および比較を除きます。その値を変更します。

そして今、私たちはこれが機能することを指しています。

System.ObjectはIComparableでしたか?それはどのように機能しましたか? IEquatable理解できますが、IComparableは意味がありません。

「テンプレートメソッド」を展開できますか?たぶんそれが手がかりです。

これは、テンプレートクラスIComparableによる.Net 3.5の変更が原因であると99%確信しています。 3.5でエラーを生成する、正常に動作する以前の.NETの例をいくつか見てきました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top