代码检查:赋值给非变量限定符表达式的属性可能会丢失
此检查会报告那些可能修改到结构体临时拷贝而非原始值的赋值和 ++ 或 -- 操作。
在代码合法但运行时访问值仍可能是结构体拷贝的情况下会报告此问题。 常见情况是通过 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日