VS2015 构建失败,动态没有错误消息

VS2015 build fails with no error message with Dynamic

我正在对返回 JSON 的一段代码编写单元测试。它 returns 的类型是匿名类型,所以我想验证它的值我只是将对象转换为 dynamic 来做我的断言。

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

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

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

构建失败的屏幕截图见下方

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

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

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

True

这是怎么回事?由于没有显示错误,我无法判断我是否错误地使用了 dynamic,或者是否因为 dynamic 而无法找到用于 IsTrue() 的重载,或者如果这是编译器中的错误(虽然我对此非常怀疑,但我没有任何证据表明我的代码有问题)。

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

根据@RonBeyer 的评论,我还尝试了更多的转换,例如以下无济于事:

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

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

仔细检查后,我发现输出中列出了一个错误 window:

c:...\DynamicBuildFailTest\UnitTest1.cs(16,33,16,42): error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

好的,VS2013更擅长报错,我会根据那些搜索:

好的,adding a reference to Microsoft.CSharp fixed the build error,但我会保留这个问题,因为这可能是 VS2015 的一个问题(在我看来)应该得到解决。

有编译错误,Visual Studio2015只是没有正确报错。然而,Visual Studio 2013 确实:

此处回答::

简而言之:

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

构建错误未出现在错误列表中是一个已知问题。例如,参见 https://github.com/dotnet/roslyn/issues/4567 .

要解决此问题,请在 "Error List" window、select "Messages" 和 select "Build + IntelliSense" 右侧的下拉菜单中].

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

顺便说一句,当你打开 Nuget window 时,确保你没有降级你的包(当我有 2.0.11 版时,它显示我升级到 2.0.9 版,这实际上是在降级.. .)

在 .net 3.0 项目中将动态关键字与 Newtonsoft.json 结合使用时出现此问题。

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

来自

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

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

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