Question

Lors de la conversion d'un projet (dans lequel une méthode de modèle d'IComparable a été utilisée plusieurs fois) de VS 2005 à VS 2008, j'ai quelques erreurs:

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

S'agit-il d'un fait réel que System.Object n'implémente plus cette interface ou si quelque chose s'est mal passé lors de la conversion? Puis-je résoudre ce problème d'une manière ou d'une autre?

Le problème concerne la méthode suivante:

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

et même quelque chose de simple comme:

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

provoque l'erreur mentionnée ci-dessus. Cela fonctionnait parfaitement dans VS 2005, alors quel peut être le problème maintenant?

Était-ce utile?

La solution

MODIFIER: je viens d'essayer votre code dans VS 2005 et 2008.

Vous avez Option Strict Off configuré dans votre fichier de projet ou code source. Votre code n'a jamais fonctionné en premier lieu et si vous définissez Option Strict On dans VS 2005, vous verrez la cause réelle de l'erreur: "L'inférence d'argument de type a échoué pour le paramètre de type 'T '" ;. Je recommande que Option Strict On soit utilisé dans tout le code VB.NET.

Vous voyez une erreur différente dans VS 2008 car il utilise une version plus récente du langage, avec des règles de surcharge et d'inférence de type très différentes. Dans VB.NET 2008, le compilateur ne peut pas résoudre l'appel de méthode, que Option Strict soit activé ou désactivé.

Le type System.Object ne crée pas et n'a jamais implémenté d'interface.

Le réglage de Option Infer dans VS 2008 n'est pas pertinent pour votre code car il n'utilise aucun type inféré.

Le moyen le plus simple de corriger l'erreur dans les deux environnements de développement (IDE) consiste à modifier le code appelant comme suit:

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

Autres conseils

Si vous exécutez le débogage du code dans Visual Studio 2005, vous verrez que le a de

Dim a as Object = 1

est un entier, mais si vous utilisez 2008, il est indiqué que c'est un objet.

Entier ont l'interface IComparable impelemented mais pas Object. Alors que faire? Réponse: Vous avez les propriétés du projet (cliquez avec le bouton droit sur le nom du projet et sélectionnez les propriétés), allez sous "Compiler" et vous avez maintenant, à l'exception de l'explicite, du strict et de la comparaison, que vous aviez en 2005, un nouveau champ nommé Infer. Modifiez cette valeur.

Et maintenant nous nous croisons les doigts pour que cela fonctionne.

System.Object était IComparable? Comment ça a fonctionné? Je peux comprendre, mais IComparable n’a aucun sens.

Pouvez-vous développer la "méthode du modèle"? Peut-être que c'est un indice.

Je suis sûr à 99% que cela est dû à une modification de .Net 3.5 avec la classe de modèle IComparable. J'ai déjà vu quelques exemples .NET antérieurs qui fonctionnent correctement mais génèrent des erreurs dans la version 3.5.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top