Вопрос

При преобразовании проекта (в котором метод шаблона 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top