Home » c# » VS2015 build fails with no error message with Dynamic

VS2015 build fails with no error message with Dynamic

Posted by: admin November 30, 2017 Leave a comment

Questions:

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.

Answers:

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.

Questions:
Answers:

There is a known issue with build errors not appearing in the error list. See, for example, https://github.com/dotnet/roslyn/issues/4567 .

To work around it, in the “Error List” window, select the pulldown menu to the right of “Messages” and select “Build + IntelliSense”.

Questions:
Answers:

I had a similar issue and the only thing that solved it to me was to upgrade my NUnit package to the latest version.

By the way when you open the Nuget window make sure that your not downgrading your package (when I had version 2.0.11 it showed me to upgrade to version 2.0.9 which is actually downgrading…)

Questions:
Answers:

Had this issue using dynamic keyword in combination with Newtonsoft.json in a .net 3.0 project.

The fix was to drop dynamic altogether and use JObject instead:

from

dynamic locales = JObject.Parse(this.Locales);

to

JObject locales = JObject.Parse(this.Locales);

Questions:
Answers:

As two people have noted in comments, for Net Core and NetStandard, this problem is sometimes fixed by adding a NuGet reference to Microsoft.CSharp.