Eu estava escrevendo um teste de unidade em um pedaço de código que retornou JSON. O tipo que ele retorna é um tipo anônimo, então pensei em verificar os valores nele. Acabei de converter o objeto em a dynamic
para fazer minhas afirmações.
No entanto, quando faço isso, minha compilação falha, mas não tenho nenhuma mensagem de erro. Consegui reproduzir isso com um código muito simples em um novo projeto de teste de unidade:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Veja abaixo uma captura de tela da compilação com falha
A compilação é bem-sucedida quando eu comento a asserção:
Por outro lado, executei o seguinte código no LinqPad 5 beta (que usa o compilador Roslyn) e não tive problemas:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Verdade
O que está acontecendo aqui? Como o erro não está aparecendo, não sei dizer se estou usando dynamic
incorretamente ou se não consigo encontrar a sobrecarga a ser usada IsTrue()
devido a dynamic
, ou se é um bug no compilador (embora eu duvide muito disso , Não tenho nenhuma evidência de que haja algo errado com meu código).
Em relação ao problema de sobrecarga, tentei, Assert.IsTrue((bool)asDynamic.someValue);
mas a compilação ainda falha, ainda não há mensagem de erro.
Pelo comentário do @ RonBeyer, eu também havia tentado mais transmissões, como as abaixo, sem sucesso:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Após uma inspeção mais detalhada, descobri que havia um erro listado na janela Saída:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): erro CS0656: Membro necessário do compilador ausente 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Ok, o VS2013 é melhor em relatar os erros, procurarei com base naqueles:
Ok, a adição de uma referência ao Microsoft.CSharp corrigiu o erro de compilação , mas deixarei esta pergunta em aberto porque é presumivelmente um problema no VS2015 que (em minha mente) deve ser resolvido.
fonte
dynamic asDynamic = (dynamic)obj;
? Ou apenas na asserção, comente a dinâmica e escrevaAssert.IsTrue(((dynamic)obj).someValue);
.Assert.IsTrue((bool)asDynamic.someValue);
?Respostas:
Há um erro do compilador, o Visual Studio 2015 simplesmente não relata o erro corretamente. No entanto, o Visual Studio 2013 faz:
Isso é respondido aqui: https://stackoverflow.com/a/13568247 :
Em resumo:
fonte
Microsoft.CSharp
DLL, mesmo queusing Microsoft.CSharp;
não esteja gerando um erro de tempo de compilação.Microsoft.CSharp
.Como duas pessoas observaram nos comentários, para o Net Core e o NetStandard, esse problema às vezes é corrigido adicionando-se uma referência ao NuGet
Microsoft.CSharp
.fonte
Teve esse problema usando a palavra-chave dinâmica em combinação com Newtonsoft.json em um projeto .net 3.0.
A correção foi abandonar a dinâmica completamente e usar JObject:
de
para
fonte
Há um problema conhecido com erros de compilação que não aparecem na lista de erros. Consulte, por exemplo, https://github.com/dotnet/roslyn/issues/4567 .
Para contornar isso, na janela "Lista de erros", selecione o menu suspenso à direita de "Mensagens" e selecione "Build + IntelliSense".
fonte
Eu tive um problema semelhante e a única coisa que me resolveu foi atualizar meu pacote NUnit para a versão mais recente.
A propósito, quando você abre a janela do Nuget, verifique se você não está desclassificando seu pacote (quando eu tinha a versão 2.0.11, ele me mostrou a atualização para a versão 2.0.9, que na verdade está desclassificando ...)
fonte