gpt4 book ai didi

c# - 为什么将值提取到 'var' 变量会改变行为?

转载 作者:行者123 更新时间:2023-11-30 17:01:14 25 4
gpt4 key购买 nike

我正在使用 EasyMoq ( http://wp7fx.codeplex.com/ ) 作为 Windows 应用商店应用程序中的模拟框架。在测试用例的设置代码中,我有如下代码:

var mock = Easy.Moq.Mock<SomeClass>();
mock.Setup(m => m.SomeMethod("an arg", Allow.Any<AnotherClass>())).Returns("a value");

这段代码工作正常。对于那些不熟悉 EasyMoq 的人,Easy.Moq.Mock<...>()实例化模拟和 mock.Setup(m => m.XYZ()).Returns(...)将模拟配置为在收到对模拟的 XYZ() 的调用时返回一个值方法。 Allow.Any<T>()表达式表示它应该匹配任何值。通过查看它的源代码,显然它只是返回 default(T)。 .细节并不那么重要。

因为那是一个很长的语句,我决定通过提取 Allow.Any<...>() 来分解它表达式转换为隐式变量,如下所示:

var mock = Easy.Moq.Mock<SomeClass>();
var arg = Allow.Any<AnotherClass>();
mock.Setup(m => m.SomeMethod("an arg", arg)).Returns("a value");

但是,此代码由于 System.NullReferenceException 而失败在模拟上调用方法之后。这可能是 EasyMoq 中的错误,但我的问题是:

这种重构如何改变代码的行为?

最佳答案

我敢打赌 .Setup签名涉及表达式...它可能将输入作为表达式进行检查并对其进行评估...并且由于您的 var 语句(var 无关紧要)评估了 Allow.Any<T>调用,然后表达式解析 default(T)而不是 Allow.Any<T> ...你能告诉我们.Setup吗?签名?

关于c# - 为什么将值提取到 'var' 变量会改变行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com