使用 Dynamic 时,VS2015构建失败且没有错误消息

我在一段返回 JSON 的代码上编写了一个单元测试。它返回的类型是一个匿名类型,所以我想验证它上面的值,我只需要将对象强制转换为 dynamic来执行断言。

但是,当我这样做时,我的构建失败了,但是我没有任何错误消息。我能够在一个新的单元测试项目中用非常简单的代码重现这一点:

[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };


dynamic asDynamic = obj;


Assert.IsTrue(asDynamic.someValue);
}

下面是构建失败的截图

build failing

不过,当我注释掉断言时,构建就会成功:

build succeeding without assert

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

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

没错

这是怎么回事?由于错误没有显示出来,我无法判断我是否正确地使用了 dynamic,或者由于 dynamic的原因,它无法找到用于 IsTrue()的重载,或者这是编译器中的一个 bug (尽管我非常怀疑这一点,但我没有任何证据表明我的代码有问题)。

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

根据@RonBeyer 的评论,我也尝试过更多的演员阵容,比如下面的,但都没有效果:

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


Assert.IsTrue((bool)asDynamic.somevalue);

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

C: ... DynamicBuildFalse Test UnitTest1.cs (16,33,16,42) : error CS0656: 缺少编译器所需的成员‘ Microsoft.CSharp. RuntimeBinder.CSharpArgumentInfo. Create’

好的,VS2013更善于报告错误,我将根据这些来搜索:

enter image description here

好的,添加对 Microsoft.CSharp 的引用修复了构建错误,但是我将留下这个问题,因为它可能是 VS2015的一个问题,(在我看来)应该得到解决。

51949 次浏览

有一个编译器错误,VisualStudio2015没有正确地报告该错误。但是,VisualStudio2013报告了:

答案就在这里:

简而言之:

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

生成错误没有出现在错误列表中,这是一个已知的问题。

为了解决这个问题,在“错误列表”窗口中,选择“消息”右侧的下拉菜单并选择“ Build + IntelliSense”。

我也遇到过类似的问题,唯一解决这个问题的方法就是将我的 NUnit 包升级到最新版本。

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

在.net 3.0项目中使用动态关键字和 Newtonsoft.json 时遇到了这个问题。

解决办法是完全放弃动态,改用 JObject:

来自

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

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

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