VS2015生成失败,没有错误消息与dynamic

我正在编写一个返回JSON的代码unit testing。 它返回的types是一个匿名types,所以我想validation它的值,我只是把对象dynamic地做我的断言。

但是,当我这样做,我的构build失败,但我没有任何错误消息。 我可以在一个新的unit testing项目中用非常简单的代码重现这个问题:

 [TestMethod] public void TestMethod1() { var obj = new { someValue = true }; dynamic asDynamic = obj; Assert.IsTrue(asDynamic.someValue); } 

请参阅下面的构build失败的截图

建设失败

当我注释掉断言时,构build成功:

建立成功没有断言

相比之下,我在LinqPad 5 beta(使用Roslyn编译器)中运行以下代码,并且没有任何问题:

 var obj = new { someValue = true }; dynamic asDynamic = obj; Console.WriteLine((asDynamic.someValue == true).ToString()); 

真正

这里发生了什么? 由于错误没有显示,我不知道如果我使用dynamic不正确,或者如果因为dynamic ,找不到用于IsTrue()的重载,或者如果这是编译器中的错误尽pipe我非常怀疑这一点,但是我没有任何证据certificate我的代码有问题)。

关于过载问题,我尝试了Assert.IsTrue((bool)asDynamic.someValue); 但构build仍然失败,仍然没有错误信息。

Per @ RonBeyer的评论,我也尝试了更多的铸造如下,无济于事:

  dynamic asDynamic = (dynamic)obj; Assert.IsTrue(((dynamic)asDynamic).someValue); Assert.IsTrue((bool)asDynamic.somevalue); 

经仔细检查,我发现输出窗口中列出了一个错误:

c:… \ DynamicBuildFailTest \ UnitTest1.cs(16,33,16,42):错误CS0656:缺less编译器所需的成员'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

好的,VS2013在报告错误方面比较好,我会根据这些search:

在这里输入图像说明

好吧, 添加一个对Microsoft.CSharp的引用修复了构build错误 ,但我会离开这个问题的开放,因为这可能是VS2015(在我心中)应该解决的问题。

有一个编译器错误,Visual Studio 2015只是不正确地报告错误。 但是,Visual Studio 2013确实:

这是在这里回答: https : //stackoverflow.com/a/13568247 :

简而言之:

添加对Microsoft.CSharp的引用,以便像这样使用dynamic

错误列表中没有出现构build错误的已知问题。 例如,请参阅https://github.com/dotnet/roslyn/issues/4567

要解决这个问题,在“Error List”窗口中,select“Messages”右边的下拉菜单,然后select“Build + IntelliSense”。

我有一个类似的问题,唯一解决这个问题的是我的NUnit包升级到最新版本。

顺便说一下,当你打开Nuget窗口确保你不降级你的包(当我有版本2.0.11它显示我升级到版本2.0.9实际上是降级…)

有一个.net 3.0项目中使用dynamic关键字与Newtonsoft.json结合使用此问题。

解决方法是完全放弃dynamic并使用JObject:

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

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

正如两位人士在评论中指出的那样,对于Net Core和NetStandard,有时通过向Microsoft.CSharp添加NuGet引用来解决此问题。