如何通过另一个getter方法的返回值来表示某个C#字段不为null

编程语言 2026-07-12

我有一个包含 Vector2Int? Position 的类,并且有一个属性,允许直接检查它是否有值:

public bool HasValue
{
    get => Position.HasValue;
}
public int? X
{
    get => Position?.x;
}

但在一个属性中,我想暴露一个Vector3Int,我正在检查Position的可空性:

if (!HasValue) return null;
return new Vector3(0.5f * (X.Value - Y.Value), 0.25f * (X.Value + Y.Value) + 0.25f, 0.0f);

但我收到一个警告,提示X.Value可能为null。检查器似乎无法理解 HasValue,以防止进入该状态。如何告诉检查器,当HasValue为 true时,X和 Y不为null?我看到过 [MemberNotNullWhenAttribute(true, nameof(HasValue))],但似乎是System.Diagnostics.CodeAnalysis的内部实现。我是不是漏掉了什么?

解决方案

MemberNotNullWhenAttribute 是一个公共属性,但你用错了。它应该标注 HasValue 属性,并指定 X 属性的名称:

[MemberNotNullWhen(true, nameof(X))]
public bool HasValue
{
    get => Position.HasValue;
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章