.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
. Ваш код никогда не работал в первую очередь, и если вы установите Option Strict On
в VS 2005, вы увидите реальную причину ошибки, которая является " Ошибка ввода аргумента типа для параметра типа 'T «& Quot ;. Я рекомендую использовать Option Strict On
во всем коде VB.NET.
В VS 2008 вы видите другую ошибку, потому что она использует более новую версию языка с очень разными правилами перегрузки и вывода типов. В VB.NET 2008 компилятор не может разрешить вызов метода независимо от того, включен или выключен Option Strict
.
Тип System.Object
не имеет и никогда не реализовывал никакого интерфейса.
Параметр Option Infer
в VS 2008 не имеет отношения к вашему коду, поскольку он не использует никаких предполагаемых типов.
Самый простой способ исправить ошибку в обеих IDE - это изменить код вызова следующим образом:
Dim a As Integer = 1
ValueIn(a, 1, 2)
Другие советы
Если вы запустите отладочный код в Visual Studio 2005, вы увидите, что a from
Dim a as Object = 1
- это целое число, но если вы используете 2008, это будет означать, что это объект.
Integer имеет интерфейс IComparable, но не Object. Так что делать? Ответ: Получите свойства проектов (щелкните правой кнопкой мыши по имени проекта и выберите свойства), зайдите в «Compile», и теперь у вас есть, кроме явного, строгого и сравнительного, которое вы имели в 2005 году, новое поле с именем Infer. Измените это значение.
А теперь мы скрестим пальцы, что это сработает.
System.Object был IComparable? Как это работает? Я могу понять это, но IComparable не имеет смысла.
Не могли бы вы рассказать о "методе шаблона"? Может быть, это ключ.
Я на 99% уверен, что это вызвано изменением .Net 3.5 с классом шаблона IComparable. Я видел несколько более ранних примеров .NET, которые работают нормально, но генерируют ошибки в 3.5. Р>