VS2015 build fails with no error message with Dynamic

51,786

Solution 1

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.

Solution 2

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.

Solution 3

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);
Share:
51,786
DLeh
Author by

DLeh

I am a Manager and Senior Developer at ASI. I have 10 years of experience in C# and Full Stack development, and I specialize in creating robust API platforms. I have a passion for making reliable code that is testable and sharable between applications. I graduated Messiah University graduate 2010 with Bachelors in Computer Science.

Updated on July 08, 2022

Comments

  • DLeh
    DLeh almost 2 years

    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.

  • Baz Guvenkaya
    Baz Guvenkaya almost 7 years
    Add the reference to Microsoft.CSharp dll even though using Microsoft.CSharp; isn't throwing a compile time error.
  • Bart Verkoeijen
    Bart Verkoeijen over 6 years
    With .NET Core add the NuGet package Microsoft.CSharp instead.
  • Joakim Skoog
    Joakim Skoog over 6 years
    This solved my problem after converting a project to .NET Standard, thank you!
  • SteveCav
    SteveCav over 6 years
    Ditto with an SSIS script adding an excel sheet.
  • Hong
    Hong about 6 years
    The same for .Net Standard based class library - add NuGet package Microsoft.CSharp.
  • ebol2000
    ebol2000 about 6 years
    @JoakimSkoog ... I had this problem on a .NET Standard project (never converted) and still had to add in a reference manually.