Reputation: 24405
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.
Upvotes: 136
Views: 52288
Reputation: 9578
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
.
Upvotes: 50
Reputation: 3408
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);
Upvotes: 2
Reputation: 1703
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...)
Upvotes: 0
Reputation: 3293
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".
Upvotes: 0
Reputation: 24405
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.
Upvotes: 227