【问题标题】:VS2015 build fails with no error message with DynamicVS2015 构建失败,没有动态错误消息
【发布时间】:2015-11-05 07:45:57
【问题描述】:

我正在对一段返回 JSON 的代码编写单元测试。它返回的类型是匿名类型,所以我想验证它上面的值,我只需将对象转换为 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());

是的

这里发生了什么?由于没有显示错误,我无法判断我是否错误地使用了dynamic,或者它是否因为dynamic 而找不到用于IsTrue() 的重载,或者这是一个错误在编译器中(尽管我非常怀疑这一点,但我没有任何证据表明我的代码有问题)。

关于过载问题,我尝试了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):错误 CS0656:缺少编译器所需的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”

好的,VS2013报错比较好,我会根据这些来搜索:

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

【问题讨论】:

  • 你确定这实际上是编译失败而不是链接失败?
  • 你能试试dynamic asDynamic = (dynamic)obj;吗?或者只是在断言中,注释掉动态并写Assert.IsTrue(((dynamic)obj).someValue);。
  • @RonBeyer 是的,我也尝试过这两种方法,但运气不好。
  • 还有一个...Assert.IsTrue((bool)asDynamic.someValue);?
  • 我在 VS2015 中尝试在测试方法中使用动态时遇到了同样的问题。构建失败,没有任何错误。添加 Microsoft.CSharp 引用后,构建成功。

标签: c# visual-studio-2015 roslyn


【解决方案1】:

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

这里有答案:https://stackoverflow.com/a/13568247:

简而言之:

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

【讨论】:

  • 添加对Microsoft.CSharp dll 的引用,即使using Microsoft.CSharp; 没有引发编译时错误。
  • 使用 .NET Core 添加 NuGet 包 Microsoft.CSharp。
  • 基于 .Net Standard 的类库也是如此 - 添加 NuGet 包 Microsoft.CSharp。
【解决方案2】:

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

【讨论】:

  • 这解决了我将项目转换为 .NET Standard 后的问题,谢谢!
  • 同上,使用 SSIS 脚本添加 Excel 工作表。
  • @JoakimSkoog ...我在 .NET Standard 项目中遇到了这个问题(从未转换),但仍然需要手动添加参考。
【解决方案3】:

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

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

来自

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

到

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

【讨论】:

    【解决方案4】:

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

    要解决此问题,请在“错误列表”窗口中,选择“消息”右侧的下拉菜单,然后选择“构建 + IntelliSense”。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 2016-06-15
        • 2021-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多