代码检查:赋值给非变量限定符表达式的属性可能会丢失
该检查会报告赋值和 ++ 或 -- 操作,这些操作可能会修改结构体的临时副本而不是原始值。
该检查适用于代码有效但访问的值在运行时可能仍为结构体副本的情况。 一个常见情况是通过 readonly 字段或其他不可变访问路径使用不受约束的泛型类型形参。 如果类型实参是结构体,成员写入可能会丢失。
示例
public interface IHasCount
{
int Count { get; set; }
}
public class Example<T>
where T : IHasCount
{
private readonly T value;
public void Set()
{
value.Count = 1;
}
}
public interface IHasCount
{
int Count { get; set; }
}
public class Example<T>
where T : class, IHasCount
{
private readonly T value;
public void Set()
{
value.Count = 1;
}
}
当访问的值已知为结构体副本时,相关快速修复可以通过 with 表达式重写代码,以显式复制并更新结构体:
结构体复制示例
public class C
{
public MyStruct? Value { get; set; }
public void M()
{
Value.Value.Count = 1;
}
}
public struct MyStruct
{
public int Count;
}
public class C
{
public MyStruct? Value { get; set; }
public void M()
{
Value = Value.Value with { Count = 1 };
}
}
public struct MyStruct
{
public int Count;
}
2026年 5月 8日