VS2015 build fails with no error message with Dynamic

DLeh picture DLeh · Aug 12, 2015 · Viewed 51.3k times · Source

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

build failing

The build succeeds when I comment out the assertion though:

build succeeding without assert

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:

enter image description here

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.

Answer

DLeh picture DLeh · Aug 12, 2015

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.