过去几天,我一直在学习新的C#7.2 ref readonly
返回值和in
结构参数。这样做时,我遇到了一个问题,该问题已通过使用单元测试的简单解决方案在此处概述:
https://github.com/Mike-EEE/StructureReferences
我有四个单元测试大致上证明了这个问题,其中两个使用MemoryMarshal.GetReference
(一个测试失败的焦点区域),两个使用常规的可分配本地字段(两个测试均按预期通过)。
在所有单元测试中,我采用一个单独的readonly struct
字段在本地分配的Structure
(命名为uint
)中并将其传递给使该字段递增并返回新的{ {1}}。
这是我使用struct
进行测试的目的:
MemoryMarshal
对于本地可分配字段:
static ref readonly Structure Add(in Structure parameter)
{
var structure = new Structure(parameter.Count + 1);
var span = MemoryMarshal.CreateReadOnlySpan(ref structure, 0);
return ref MemoryMarshal.GetReference(span);
}
对于ref readonly Structure AddFromLocal(in Structure parameter)
{
_local = new Structure(parameter.Count + 1);
return ref _local;
}
,如果我将对MemoryMarshal.GetReference
方法调用的调用结果分配给局部变量,则测试通过:
Add
但如果我内联结果,则不会:
[Fact]
public void Assignments()
{
var one = Add(_structure);
var two = Add(one);
var three = Add(two);
three.Count.Should().Be(3);
}
我的问题是:这是预期的行为吗?如果是这样,为什么? :)在我看来,如果将引用传递给另一个方法,然后将其传递给另一个方法([Fact]
public void Inline() // Doesn't pass.
{
Add(in Add(in Add(in _structure))).Count.Should().Be(3);
}
),它将像其他测试(和本地现场测试)一样不受阻碍地返回。忍耐。
任何关于这两种测试为何结果不同的解释将不胜感激。