.NET 3.5 - Objet n'implémentant pas IComparable?
-
06-07-2019 - |
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?
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.