.NET 3.5 - Объект не реализует IComparable? - PullRequest
0 голосов
/ 27 октября 2009

При преобразовании проекта (в котором шаблонный метод 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, так в чем же проблема сейчас?

Ответы [ 4 ]

3 голосов
/ 27 октября 2009

РЕДАКТИРОВАТЬ: Я только что попробовал ваш код в VS 2005 и 2008.

В вашем проекте или файле исходного кода настроено Option Strict Off. Ваш код никогда не работал в первую очередь, и если вы установите Option Strict On в VS 2005, вы увидите реальную причину ошибки, а именно «Ошибка вывода аргумента типа для параметра типа« T »». Я рекомендую использовать 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)
1 голос
/ 28 октября 2009

Если вы запустите отладочный код в Visual Studio 2005, вы увидите, что a из

Dim a as Object = 1

- это целое число, но если вы используете 2008, оно будет указывать, что это объект.

Integer имеет интерфейс IComparable, но не Object. Так что делать? Ответ: Получите свойства проектов (щелкните правой кнопкой мыши по имени проекта и выберите свойства), зайдите в «Compile», и теперь у вас есть, кроме явного, строгого и сравнительного, которое вы имели в 2005 году, новое поле с именем Infer. Измените это значение.

А теперь мы скрестим пальцы, чтобы это сработало.

0 голосов
/ 28 октября 2009

Я на 99% уверен, что это вызвано изменением .Net 3.5 с классом шаблона IComparable. Я видел несколько более ранних примеров .NET, которые работают нормально, но генерируют ошибки в 3.5.

0 голосов
/ 27 октября 2009

System.Object был IComparable? Как это работает? Я могу понять это, но IComparable не имеет смысла.

Можете ли вы расширить "метод шаблона"? Может быть, это ключ.

...