.NET 3.5-オブジェクトはIComparableを実装していませんか?
-
06-07-2019 - |
質問
プロジェクト(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の例をいくつか見てきました。