Frage

Wenn Sie ein Projekt Umwandlung (in dem eine Template-Methode von IComparable ein paar Mal benutzt wurde) von VS 2005 VS 2008 Ich habe einige Fehler bekommen:

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

Ist dies eine tatsächliche Tatsache, dass System.Object nicht mehr diese Schnittstelle implementiert, oder etwas ging während der convertion falsch? Kann ich das irgendwie beheben?

Das Problem ist mit der folgenden Methode:

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

und sogar etwas Einfaches wie:

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

bewirkt, dass die oben genannten Fehler. Es funktionierte perfekt in VS 2005, so kann, was das Problem jetzt sein?

War es hilfreich?

Lösung

EDIT: Ich habe gerade versucht, den Code sowohl in VS 2005 und 2008

.

Sie haben Option Strict Off in Ihrem Projekt oder Quellcodedatei konfiguriert. Ihr Code arbeitete nie an erster Stelle, und wenn Sie Option Strict On in VS 2005 gesetzt ist, wird man die wahre Ursache des Fehlers sehen, die „Typ Argument Inferenz für Typ-Parameter‚T‘ist fehlgeschlagen“ ist. Ich empfehle, dass Option Strict On in alle VB.NET-Code verwendet werden.

Sie sehen einen anderen Fehler in VS 2008, weil es eine neuere Version der Sprache verwendet, mit sehr unterschiedlicher Überlastung und Typinferenz Regeln. In VB.NET 2008 kann der Compiler den Methodenaufruf unabhängig davon lösen, ob Option Strict ein- oder ausgeschaltet ist.

Der System.Object Typ nicht und hat nie umgesetzt jede Schnittstelle.

Die Einstellung von Option Infer in VS 2008 ist der Code nicht relevant, da es keine Verwendung von abgeleiteten Typen machen.

Der einfachste Weg, den Fehler in beiden IDEs zu beheben, ist die Berufung Code zu ändern also:

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

Andere Tipps

Wenn Sie den Debug den Code in Visual Studio 2005 ausführen, werden Sie sehen, dass das eine von

Dim a als Object = 1

ist eine ganze Zahl, aber wenn Sie 2008 verwenden es wird angegeben, dass es ein Objekt.

Integer haben die Schnittstelle IComparable impelemented aber nicht Objekt. Also, was zu tun? Antwort: Hat die Projekte Eigenschaften (Recht, den Namen Projekt klicken, und wählen Sie Eigenschaften), geht unter ‚Compile‘ in und dort haben Sie jetzt mit Ausnahme der ausdrücklichen, streng und vergleichen zu können, dass Sie im Jahr 2005 hatten, ein neues Feld namens Infer. Ändern Sie diesen Wert.

Und jetzt fahren wir unsere Finger, dass dies funktionieren wird.

System.Object war IComparable? Wie funktionierte das? IEquatable Ich kann verstehen, aber IComparable ist nicht sinnvoll.

Können Sie auf „Template-Methode“ erweitern? Vielleicht ist das ein Hinweis.

Ich bin 99% sicher, dass dies durch eine Änderung in .NET 3.5 mit der Template-Klasse IComparable verursacht wird. Ich habe ein paar von früheren .NET Beispielen gesehen, die gut funktionieren, aber Fehler in 3.5 generieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top