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

DLe*_*Leh 129 c# roslyn visual-studio-2015

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

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

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

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}
Run Code Online (Sandbox Code Playgroud)

请参阅下面的构建失败的屏幕截图

建立失败

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

在没有断言的情况下构建成功

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

var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Run Code Online (Sandbox Code Playgroud)

真正

这里发生了什么?由于错误没有显示我不能说,如果我用dynamic,不正确,或者如果它不能找到使用过载IsTrue()的,因为dynamic,或者如果这是在编译器中的错误(虽然我很怀疑这个,我没有任何证据证明我的代码有问题).

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

根据Per @ RonBeyer的评论,我也尝试过更多的演员,如下所示无济于事:

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

    Assert.IsTrue((bool)asDynamic.somevalue);
Run Code Online (Sandbox Code Playgroud)

经过仔细检查,我发现输出窗口中列出了一个错误:

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

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

在此输入图像描述

好的,添加对Microsoft.CSharp的引用修复了构建错误,但我会将此问题保持打开状态,因为它可能是VS2015的一个问题(在我看来)应该解决.

DLe*_*Leh 219

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

这在这里得到解答:https://stackoverflow.com/a/13568247:

简而言之:

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

  • 使用**.NET Core**添加NuGet包`Microsoft.CSharp`. (39认同)
  • 添加对`Microsoft.CSharp` dll的引用,即使`使用Microsoft.CSharp;`不会引发编译时错误. (8认同)
  • 基于.Net Standard的类库也是如此 - 添加NuGet包Microsoft.CSharp. (6认同)

Nic*_*sen 39

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

  • 这将项目转换为.NET Standard后解决了我的问题,谢谢! (2认同)