You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抑制接收元组数组的方法引发的「可为空值类型可能为 null」警告?

解决方案

可以通过System.Diagnostics.CodeAnalysis命名空间下的MemberNotNullWhen属性实现需求,明确标注当方法返回true时,数组内所有元组的Item2成员均不为null,以此消除nullable警告。

1. 为方法添加属性标注

修改方法签名,添加MemberNotNullWhen属性:

using System.Diagnostics.CodeAnalysis;
using System.Numerics;

public static bool CalculateMissingStuff(
    [MemberNotNullWhen(true, nameof(vertices.Item2))] 
    (Vector3, Vector3?)[] vertices)
{
    for (var vertexIndex = 0; vertexIndex < vertices.Length; vertexIndex++)
    {
        if (vertices[vertexIndex].Item2 == null)
        {
            // 替换为你的实际计算逻辑
            vertices[vertexIndex].Item2 = vertices[vertexIndex].Item1;
        }
        
        // 此处添加计算失败的判断逻辑,比如无法计算时直接返回false
        // if (无法计算的条件) return false;
    }
    
    return true;
}

注意:nameof(vertices.Item2)是C# 10及以上版本支持的语法,用于引用数组元素的成员。如果项目使用更低版本的C#,可以直接使用字符串字面量"vertices.Item2"。

2. 调用方法验证

调用方法并检查返回值为true后,编译器会自动识别数组内所有元组的Item2不为null,不会再触发「可为空值类型可能为 null」的警告:

var vertices = new (Vector3, Vector3?)[]
{
    (new Vector3(1, 2, 3), null),
    (new Vector3(4, 5, 6), new Vector3(8, 10, 12))
};

if (CalculateMissingStuff(vertices))
{
    // 此处访问Item2不会触发警告,编译器已确认其不为null
    Vector3 firstResult = vertices[0].Item2;
    Vector3 secondResult = vertices[1].Item2;
}

备选方案(低版本C#兼容)

如果项目无法使用C# 10及以上版本,或者上述属性标注不生效,可以考虑自定义结构体替代元组:

public struct VertexPair
{
    public Vector3 Item1;
    public Vector3 Item2;
}

public static bool CalculateMissingStuff(VertexPair[] vertices)
{
    // 逻辑类似,直接操作Item2即可,无需处理nullable
    for (int i = 0; i < vertices.Length; i++)
    {
        // 此处可根据Item1计算Item2,无需判断null
        vertices[i].Item2 = vertices[i].Item1 * 2;
    }
    return true;
}

内容的提问来源于stack exchange,提问作者Morris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:15:38