NET 3.5 - O objeto não implementar IComparable?
-
06-07-2019 - |
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?
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.