无法在 lambda 表达式中捕获ref struct ,但您仍然可以在 lambda 表达式中使用它 - 您只需在此处声明变量,这样它就不会是非 ref-struct 中的字段。
例如,这编译并成功:
[Fact]
public void HelpMe()
{
Assert.ThrowsAny<Exception>(() => {
var pls = new Span<byte>();
var plsExplode = pls[-1];
});
}
现在我将第一个承认这并不理想:您确实希望在操作中做尽可能少的工作,以便仅在预期的代码段失败时通过。
在那里使用Assert.Throws
有帮助,因此只有预期的异常会导致通过。此外,您可以捕获bool
在投掷部分之前更改的 a,然后检查您是否已经做到了:
[Fact]
public void HelpMe()
{
bool reachedThrowingPart = false;
Assert.Throws<IndexOutOfRangeException>(() =>
{
var span = new Span<byte>();
reachedThrowingPart = true;
var ignored = span[-1];
});
Assert.True(reachedThrowingPart);
}
这一切都比没有 ref struct 限制的情况要冗长得多,但它们是可以理解的......