gpt4 book ai didi

c# - 最小起订量是触发代码契约(Contract)?

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:59 26 4
gpt4 key购买 nike

给定这段代码:

[ContractClass(typeof(DogContract))]
public interface IDog {
void Eat(object obj);
}

[ContractClassFor(typeof(IDog))]
internal abstract DogContract : IDog {
public void Eat(object obj) {
Contract.Requires<ArgumentNullException>(obj != null);
}
}

var dogMock = new Mock<IDog>();
dogMock.Object.Eat(null); // Throws ArgumentNullException

似乎重写器以某种方式将其行为放入模拟对象中,这是我没想到的。我不认为这是一个真正的问题,只是出乎意料。有人知道这是怎么回事吗?

最佳答案

"Call-site Requires checking"就可以了。然后,重写器会将前提条件放入调用者 代码中,而不是实现。因此,即使无法重写模拟对象中的代码(它是在运行时生成的),调用方中的代码也可以。

这是没有调用站点要求的生成代码的样子:

private static void Main(string[] args)
{
Mock<IDog> m = new Mock<IDog>();
m.Object.Eat(null);
}

还有:

private static void Main(string[] args)
{
Mock<IDog> m = new Mock<IDog>();
IDog.V$Eat(m.Object, null);
}

IDog 是一个静态类,它包含 IDog 接口(interface)中的所有方法以及先决条件。这是 Eat 的样子:

internal static void V$Eat(IDog @this, object obj)
{
__ContractsRuntime.Requires<ArgumentNullException>(
obj != null, null, "obj != null");
@this.Eat(obj);
}

这样一来,即使类中的代码无法重写,前置条件也会被调用。

关于c# - 最小起订量是触发代码契约(Contract)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8792533/

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