VS2015构建动态代码时没有错误信息

136
我正在编写一个关于返回 JSON 的代码的单元测试。它返回的类型是匿名类型,所以我想验证它上面的值,我只需将对象转换为 dynamic 来进行断言即可。
但是,当我这样做时,我的构建失败了,但我没有任何错误消息。我能够在新的单元测试项目中使用非常简单的代码重现这个问题:
[TestMethod]
public void TestMethod1()
{
    var obj = new { someValue = true };

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

请参见下面的构建失败截图。

build failing

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

build succeeding without assert

相比之下,我在使用Roslyn编译器的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:...\DynamicBuildFailTest\UnitTest1.cs(16,33,16,42): error CS0656: 缺少编译器所需的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”

好的,VS2013在报告错误方面做得更好,我将根据这些进行搜索:

enter image description here

好的,添加对Microsoft.CSharp的引用修复了构建错误, 但是我会保留这个问题,因为它可能是与VS2015有关的问题,应该得到解决。


你可以尝试使用 dynamic asDynamic = (dynamic)obj; 吗?或者在断言中,注释掉 dynamic 并写成 Assert.IsTrue(((dynamic)obj).someValue); - Ron Beyer
还有一个... Assert.IsTrue((bool)asDynamic.someValue); - Ron Beyer
@RonBeyer 是的,我也尝试过那个。 - DLeh
似乎模板缺少引用。我会验证这个答案。然后你可以关闭你的问题。如果你认为VS团队应该解决这个问题,一旦验证可以重现,可以与他们联系。 - user1228
1
在尝试在测试方法中使用动态(dynamic)时,我在VS2015中遇到了相同的问题。构建失败了,但没有任何错误提示。在添加了Microsoft.CSharp引用之后,构建成功了。 - Sarath Rachuri
显示剩余5条评论
5个回答

227

编译器出错了,Visual Studio 2015不能正确地报告错误。然而,Visual Studio 2013可以:

在这里得到了答案:https://dev59.com/CGYr5IYBdhLWcg3wkbFM#13568247

简而言之:

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


9
即使“using Microsoft.CSharp;”没有引发编译时错误,也请添加对“Microsoft.CSharp”dll的引用。 - Baz Guvenkaya
45
使用 .NET Core 时,请添加 NuGet 包 Microsoft.CSharp - Bart Verkoeijen
6
对于基于 .Net Standard 的类库,需要添加 NuGet 包 Microsoft.CSharp。 - Hong

50

正如两位评论者所指出的,对于Net Core和NetStandard,有时可以通过添加对Microsoft.CSharp的NuGet引用来解决此问题。


3
将项目转换为 .NET Standard 后,这解决了我的问题,谢谢! - Joakim Skoog
1
使用SSIS脚本添加Excel表格,同样可以这么做。 - SteveCav
@JoakimSkoog...我在一个.NET Standard项目上遇到了这个问题(从未转换过),仍然需要手动添加引用。 - ebol2000

2

我在一个 .net 3.0 项目中,使用 dynamic 关键字和 Newtonsoft.json 组合时遇到了这个问题。

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

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

为了

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

0

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

为了解决这个问题,在“错误列表”窗口中,选择“消息”右侧的下拉菜单,然后选择“构建+智能感知”。


0

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

顺便提醒一下,在打开 Nuget 窗口时要确保您没有降级包(当我拥有版本 2.0.11 时,它向我展示了要升级到版本 2.0.9,实际上是降级...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接