ChatGPT解决这个技术问题 Extra ChatGPT

VS2015 build fails with no error message with Dynamic

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

https://i.stack.imgur.com/pxQnz.png

The build succeeds when I comment out the assertion though:

https://i.stack.imgur.com/PYKCt.png

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:

https://i.stack.imgur.com/TClxn.png

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.

Are you sure it's actually a compile failure rather than a link failure?
Can you try dynamic asDynamic = (dynamic)obj;? Or just in the Assertion, comment out the dynamic and write Assert.IsTrue(((dynamic)obj).someValue);.
@RonBeyer yes I had tried both of those as well, not luck.
One more... Assert.IsTrue((bool)asDynamic.someValue);?
I faced the same issue in VS2015 while trying to use dynamic in test methods. The build failed without any errors. And after adding the Microsoft.CSharp reference the build succeeded.

C
Community

There is a compiler error, Visual Studio 2015 just does not report the error properly. However, Visual Studio 2013 does:

https://i.stack.imgur.com/W0VRr.png

This is answered here: https://stackoverflow.com/a/13568247:

In short:

Add a reference to Microsoft.CSharp in order to use dynamic like this.


Add the reference to Microsoft.CSharp dll even though using Microsoft.CSharp; isn't throwing a compile time error.
With .NET Core add the NuGet package Microsoft.CSharp instead.
The same for .Net Standard based class library - add NuGet package Microsoft.CSharp.
N
Nicholas Petersen

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.


This solved my problem after converting a project to .NET Standard, thank you!
Ditto with an SSIS script adding an excel sheet.
@JoakimSkoog ... I had this problem on a .NET Standard project (never converted) and still had to add in a reference manually.
D
Dan Ochiana

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);

N
Neal Gafter

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".


s
silver

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...)