0

プロジェクト (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 では完全に機能していましたが、現在何が問題になっているのでしょうか?

4

4 に答える 4

3

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

Option Strict Offプロジェクトまたはソース コード ファイルで構成しました。あなたのコードはそもそも機能しませんでしOption Strict Onた。VS 2005 で設定すると、エラーの本当の原因が表示されます。これは、「型パラメーター 'T' の型引数の推論に失敗しました」です。Option Strict Onすべての VB.NET コードで使用することをお勧めします。

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

このSystem.Object型はインターフェイスを実装しておらず、実装したこともありません。

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

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

    Dim a As Integer = 1
    ValueIn(a, 1, 2)
于 2009-10-27T10:16:36.360 に答える
1

Visual Studio 2005 でコードのデバッグを実行すると、

オブジェクトとして a を薄暗くする = 1

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

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

そして今、私たちはこれがうまくいくと指を交差させます.

于 2009-10-28T14:13:13.663 に答える
0

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

「テンプレートメソッド」について詳しく教えてください。多分それは手がかりです。

于 2009-10-27T10:22:23.120 に答える
0

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

于 2009-10-28T17:04:11.460 に答える