I was writing a unit test on a piece of code that returned JSON. The type that it returns is an anonymous type, so I thought to verify the values on it I'd just cast the object to a dynamic
to do my assertions.
However, when I do that, my build fails but I don't have any error messages. I was able to reproduce this with very simple code in a new Unit Test Project:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
See below for a screenshot of the build failing
The build succeeds when I comment out the assertion though:
In contrast, I ran the following code in LinqPad 5 beta (which uses the Roslyn compiler) and had no issues:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
True
What's going on here? Since the error isn't showing I can't tell if I'm using dynamic
incorrectly, or if it can't find the overload to use for IsTrue()
because of the dynamic
, or if this is a bug in the compiler (though I highly doubt this, I don't have any evidence that there's something wrong with my code).
Regarding the overload issue, I tried Assert.IsTrue((bool)asDynamic.someValue);
but the build still fails, still no error message.
Per @RonBeyer's comment, I had also tried more casting such as below to no avail:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Upon closer inspection, I found that there was an error listed in the Output window:
c:...\DynamicBuildFailTest\UnitTest1.cs(16,33,16,42): error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Okay, VS2013 is better at reporting the errors, I will search based on those:
Okay, adding a reference to Microsoft.CSharp fixed the build error, but I will leave this question open because it's presumably an issue with VS2015 that (in my mind) should be resolved.
There is a compiler error, Visual Studio 2015 just does not report the error properly. However, Visual Studio 2013 does:
This is answered here: https://stackoverflow.com/a/13568247:
In short:
Add a reference to Microsoft.CSharp in order to use
dynamic
like this.