Pergunta

Ao converter um projeto (em que um método de modelo de IComparable foi usado algumas vezes) do VS 2005 para VS 2008 Eu tenho alguns erros:

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

Este é um fato real que System.Object implementos não mais que interface, ou algo deu errado durante a conversão? Eu posso consertar isso de alguma forma?

O problema é com o método seguinte:

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

e até mesmo algo simples como:

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

faz com que o erro mencionado acima. Ele funcionou perfeitamente no VS 2005, então o que pode ser o problema agora?

Foi útil?

Solução

EDIT:. Eu apenas tentei seu código em ambos VS 2005 e 2008

Você Option Strict Off configurado em seu arquivo de código do projeto ou fonte. Seu código nunca trabalhou em primeiro lugar, e se você definir Option Strict On no VS 2005, você vai ver a verdadeira causa do erro, que é "inferência argumento Tipo falhou por tipo de parâmetro 'T'". Eu recomendo que Option Strict On ser usado em todo o código VB.NET.

Você vê um erro diferente no VS 2008 porque está usando uma versão mais recente da linguagem, com regras muito diferentes de sobrecarga e tipo de inferência. Em VB.NET 2008, o compilador não pode resolver a chamada do método independentemente de Option Strict está ligado ou desligado.

O tipo System.Object não faz e nunca foi implementada qualquer interface.

A configuração de Option Infer no VS 2008 não é relevante para o seu código, porque não fazer uso de quaisquer tipos inferidos.

A maneira mais simples de corrigir o erro em ambos os IDEs é mudar o código de chamada assim:

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

Outras dicas

Se você executar a depuração do código no Visual Studio 2005, você verá que a um de

Dim um objecto como = 1

é um inteiro, mas se você usar 2008, irá indicar que ele é um objeto.

Integer tem a interface IComparable impelemented, mas não objeto. Então o que fazer? Resposta: Got as propriedades Projetos (clique direito no nome do projeto e selecione propriedades), Go em menos 'Compilar' e lá você tem agora, exceto o explícito, rigoroso e comparar, que teve em 2005, um novo campo chamado Infer. Alterar esse valor.

E agora nós cruzar os dedos que isso vai funcionar.

System.Object foi IComparable? Como é que isso funciona? IEquatable eu posso entender, mas não IComparable não faz sentido.

Você pode expandir em "método de modelo"? Talvez essa seja uma pista.

Estou 99% certo de que este é causado por uma mudança na Net 3.5 com o IComparable classe de modelo. Eu vi um par de exemplos anteriores .NET que funcionam bem, mas gerar erros em 3,5.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top