我正在对一段返回 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());
True
这是怎么回事?由于没有显示错误,我无法判断我是否错误地使用了 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): error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
好的,VS2013更擅长报错,我会根据那些来搜索:
好的,adding a reference to Microsoft.CSharp fixed the build error ,但我会保留这个问题,因为它可能是 VS2015 的一个问题(在我看来)应该得到解决。
最佳答案
存在编译错误,Visual Studio 2015 只是没有正确报错。但是,Visual Studio 2013 会:
这里有答案:https://stackoverflow.com/a/13568247 :
简而言之:
Add a reference to Microsoft.CSharp in order to use
dynamic
like this.
关于c# - VS2015 构建失败,动态没有错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31969637/