Domanda

Durante la conversione di un progetto (in cui un metodo modello di IComparable è stato utilizzato alcune volte) da VS 2005 a VS 2008 ho riscontrato alcuni errori:

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

È un fatto reale che System.Object non implementa più quell'interfaccia o qualcosa è andato storto durante la conversione? Posso risolvere questo in qualche modo?

Il problema è con il seguente metodo:

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

e persino qualcosa di semplice come:

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

causa l'errore sopra menzionato. Ha funzionato perfettamente in VS 2005, quindi quale può essere il problema adesso?

È stato utile?

Soluzione

MODIFICA: Ho appena provato il tuo codice sia in VS 2005 che in 2008.

Hai Option Strict Off configurato nel tuo progetto o nel file del codice sorgente. Il tuo codice non ha mai funzionato in primo luogo, e se hai impostato Opzione rigorosa su in VS 2005, vedrai la vera causa dell'errore, che è " inferenza dell'argomento di tipo non riuscita per il parametro di tipo 'T '" ;. Raccomando di utilizzare Option Strict On in tutto il codice VB.NET.

Viene visualizzato un errore diverso in VS 2008 perché utilizza una versione più recente della lingua, con regole di inferenza e di tipo di inferenza molto diverse. In VB.NET 2008, il compilatore non può risolvere la chiamata del metodo indipendentemente dal fatto che Option Strict sia attivato o disattivato.

Il tipo System.Object non ha e non ha mai implementato alcuna interfaccia.

L'impostazione di Option Infer in VS 2008 non è rilevante per il tuo codice perché non utilizza alcun tipo dedotto.

Il modo più semplice per correggere l'errore in entrambi gli IDE è cambiare il codice chiamante in questo modo:

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

Altri suggerimenti

Se esegui il debug del codice in Visual Studio 2005 vedrai che a da

Dim a as Object = 1

è un numero intero ma se usi il 2008 indicherà che si tratta di un oggetto.

Integer ha l'interfaccia IComparable impelemented ma non Object. Quindi che si fa? Risposta: Ottieni le proprietà del progetto (fai clic con il pulsante destro del mouse sul nome del progetto e seleziona le proprietà), vai sotto 'Compila' e lì ora hai tranne esplicito, rigoroso e confronta, che avevi nel 2005, un nuovo campo chiamato Infer. Modifica quel valore.

E ora incrociamo le dita che funzionerà.

System.Object era IComparable? Come ha funzionato? IEquatable Posso capire ma IComparable non ha senso.

Puoi espandere il " metodo modello " ;? Forse è un indizio.

Sono sicuro al 99% che ciò sia causato da una modifica di .Net 3.5 con la classe template IComparable. Ho visto un paio di esempi .NET precedenti che funzionano bene ma generano errori in 3.5.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top