C#中如何使用可空ValueTuple作为方法参数并访问其成员?
可空ValueTuple作为方法参数的正确用法
当然可以把可空ValueTuple作为方法参数!你之前的代码运行失败,主要是因为混淆了空合并运算符(??)和三元运算符(?:)的语法,加上可空值类型的成员访问需要先确认非空。我来给你拆解正确的实现方式:
首先,ValueTuple是值类型,所以给它加上?就变成了可空值类型(等价于Nullable<ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D>>),完全可以作为方法参数使用,还能设置默认值null。
方法一:用HasValue判断 + 三元运算符
这种方式最直观,先检查可空ValueTuple是否有值,再决定取成员还是用默认值:
public Plane Init(ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D>? vertices = null) { Vector4D[] m_vertices = new Vector4D[4]; // 检查vertices是否非空,非空则取Value.Item1,否则用默认Vector4D m_vertices[0] = vertices.HasValue ? vertices.Value.Item1 : new Vector4D(0, 0, 0, 0); m_vertices[1] = vertices.HasValue ? vertices.Value.Item2 : new Vector4D(0, 0, 0, 0); m_vertices[2] = vertices.HasValue ? vertices.Value.Item3 : new Vector4D(0, 0, 0, 0); m_vertices[3] = vertices.HasValue ? vertices.Value.Item4 : new Vector4D(0, 0, 0, 0); return this; }
方法二:解构 + 空合并运算符(更简洁)
利用C#的解构特性,先给可空ValueTuple设置一个默认的非空ValueTuple作为 fallback,直接解构到变量里,代码会更清爽:
public Plane Init(ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D>? vertices = null) { // 当vertices为null时,使用后面的默认ValueTuple var (v1, v2, v3, v4) = vertices ?? (new Vector4D(0,0,0,0), new Vector4D(0,0,0,0), new Vector4D(0,0,0,0), new Vector4D(0,0,0,0)); Vector4D[] m_vertices = new Vector4D[4]; m_vertices[0] = v1; m_vertices[1] = v2; m_vertices[2] = v3; m_vertices[3] = v4; return this; }
为什么你的写法会失败?
你之前尝试的vertices ?? vertices.Item1 : ...和vertices ?? vertices?.Item1 : ...都是语法错误:
??是二元运算符,只需要两个操作数(左侧表达式 ?? 右侧默认值),不需要搭配:- 可空值类型不能直接访问
Item1,必须先通过Value属性(或者用?.空条件运算符),但结合??时逻辑也不对
用上面两种方法就能正确处理可空ValueTuple的成员访问啦!
内容的提问来源于stack exchange,提问作者Razzupaltuff
相关产品推荐
相关产品推荐

