VS2015构建失败,并且没有带有Dynamic的错误消息


136

我正在对返回JSON的代码编写单元测试。它返回的类型是一个匿名类型,所以我认为要验证它的值,我只是将对象转换为a 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,不正确或者如果它不能找到超载使用IsTrue(),因为的dynamic,或者如果这是在编译器中的错误(虽然我很怀疑这个,我没有任何证据表明我的代码有问题)。

关于过载问题,我尝试过,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更好地报告了错误,我将根据以下内容进行搜索:

在此处输入图片说明

好的,添加对Microsoft.CSharp的引用可解决构建错误,但我将这个问题悬而未决,因为(在我看来)应该是VS2015的问题,应该解决。


您确定这实际上是编译失败而不是链接失败吗?
David W

你可以尝试dynamic asDynamic = (dynamic)obj;吗?或者只是在断言中,注释掉动态并编写Assert.IsTrue(((dynamic)obj).someValue);
罗恩·拜尔

@RonBeyer是的,我也尝试过这两种方法,而不是运气。
DLeh 2015年

还有一个... Assert.IsTrue((bool)asDynamic.someValue);
罗恩·拜尔

1
在尝试在测试方法中使用动态时,我在VS2015中遇到了相同的问题。构建失败,没有任何错误。在添加Microsoft.CSharp参考之后,构建成功。
Sarath Rachuri 2015年

Answers:


226

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

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

简而言之:

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


9
Microsoft.CSharp即使using Microsoft.CSharp;未引发编译时错误,也要添加对dll 的引用。
Barry Guvenkaya

45
使用.NET Core,请Microsoft.CSharp改为添加NuGet软件包。
Bart Verkoeijen

6
基于.Net Standard的类库也是如此-添加NuGet包Microsoft.CSharp。

49

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


3
将项目转换为.NET Standard后,这解决了我的问题,谢谢!
Joakim Skoog,

1
同上一个带有SSIS脚本的Excel表格。
SteveCav

@JoakimSkoog ...我在.NET Standard项目(从未转换)中遇到此问题,但仍必须手动添加引用。
ebol2000 '18

1

在.net 3.0项目中结合使用动态关键字和Newtonsoft.json来解决此问题。

解决办法是完全删除动态并使用JObject代替:

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

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


0

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

顺便说一句,当您打开Nuget窗口时,请确保您没有降级您的软件包(当我有2.0.11版本时,它指示我升级到了实际上是降级的版本2.0.9。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.