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像这样使用.
Nic*_*sen 39
正如两位人士在评论中指出的那样,对于Net Core和NetStandard,这个问题有时会通过添加NuGet引用来解决Microsoft.CSharp.