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

时间:2015-08-12 15:31:44

标签: c# visual-studio-2015 roslyn

我正在为返回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(使用Roslyn编译器)中运行了以下代码并且没有问题:

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

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

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

Per @ RonBeyer的评论,我也试过更多的演员如下,但无济于事:

{{1}}

仔细检查后,我发现输出窗口中列出了错误:

  

c:... \ DynamicBuildFailTest \ UnitTest1.cs(16,33,16,42):错误CS0656:缺少编译器所需的成员' Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

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

enter image description here

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

4 个答案:

答案 0 :(得分:206)

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

在此处回答:https://stackoverflow.com/a/13568247

简而言之:

  

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

答案 1 :(得分:35)

有两个人在评论中指出,对于Net Core和NetStandard,有时会通过向Microsoft.CSharp添加NuGet引用来解决此问题。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

修复是完全放弃动态并改为使用JObject:

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

JObject locales = JObject.Parse(this.Locales);
相关问题