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.
dynamic asDynamic = (dynamic)obj;
? Ou apenas na asserção, comente a dinâmica e escreva Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?