首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否访问可为空的ValueTuple的成员?

是否访问可为空的ValueTuple的成员?
EN

Stack Overflow用户
提问于 2021-10-19 12:36:46
回答 4查看 86关注 0票数 0

要访问ValueTuple成员,我将执行以下操作

代码语言:javascript
复制
public Plane Init (ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D> vertices)
{
    Vector4D[] m_vertices = new Vector4D [4];
    m_vertices[0] = vertices.Item1;
    // etc
    return this;
}

我可以使用一个可以为空的ValueTuple参数吗?我如何访问它的成员?以下是我尝试过的方法,但不起作用:

代码语言:javascript
复制
public Plane Init (ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D>? vertices = null)
{
    Vector4D[] m_vertices = new Vector4D [4];
    // not working
    m_vertices[0] = vertices ?? vertices.Item1 : CVector4D (0,0,0,0);
    // not working either
    m_vertices[0] = vertices ?? vertices?.Item1 : CVector4D (0,0,0,0);
    // etc
    return this;
}
EN

回答 4

Stack Overflow用户

发布于 2021-10-19 12:50:34

要访问Nullable<ValueTuple<>>的项,应该使用Null-conditional operators ?.运算符,如果是null,则使用null-coalescing operator ??来提供值:

代码语言:javascript
复制
var v1 = vertices?.Item1 ?? fallBackValue;

但是,为了避免多个冗余的null测试,如果元组为null,则应该使用默认值:

代码语言:javascript
复制
private static Vector4D ZeroVector4D { get; } = new Vector4D();
private static (Vector4D, Vector4D, Vector4D, Vector4D) DefaultVertices { get; } = (ZeroVector4D, ZeroVector4D, ZeroVector4D, ZeroVector4D);

public Plane Init(ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D>? vertices = null)
{
    return Init(vertices ?? DefaultVertices);
}

public Plane Init(ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D> vertices)
{
    m_vertices[0] = v.Item1;
    m_vertices[1] = v.Item2;
    m_vertices[2] = v.Item3;
    m_vertices[3] = v.Item4;

    return this;
}

您还可以使用一些pattern matching

代码语言:javascript
复制
var m_vertices = new Vector4D[4];
if (vertices is (Vector4D a, Vector4D b, Vector4D c, Vector4D d))
{
    m_vertices[0] = a;
    m_vertices[1] = b;
    m_vertices[2] = c;
    m_vertices[3] = d;
}
票数 1
EN

Stack Overflow用户

发布于 2021-10-19 13:04:22

通过对ValueTuple类型和值使用简明的C#语法,我们可以这样写:

代码语言:javascript
复制
static readonly Vector4D Origin4D = new Vector4D(0, 0, 0, 0);

public Plane Init((Vector4D, Vector4D, Vector4D, Vector4D)? vertices)
{
    var v = vertices ?? (Origin4D, Origin4D, Origin4D, Origin4D);
    var m_vertices = new Vector4D[] { v.Item1, v.Item2, v.Item3, v.Item4 };

    // etc
    return this;
}

如果您控制着Vector4D,最好将其添加为静态成员

代码语言:javascript
复制
public static Vector4D Origin { get; } = new Vector4D(0, 0, 0, 0);

然后,您可以使用Vector4D.Origin访问它。

如果需要可变数量的参数,请使用params参数:

代码语言:javascript
复制
public Plane Init(params Vector4D[] vertices)
{
    Vector4D[] m_vertices = vertices;
}
票数 1
EN

Stack Overflow用户

发布于 2021-10-19 12:54:34

我找到了一个最接近我想要的解决方案:

代码语言:javascript
复制
public Plane Init (ValueTuple<CVector4D, CVector4D, CVector4D, CVector4D>? vertices = null)
{
    CVector4D[] m_vertices;
    m_vertices = new Vector4D[4];
    // the elements of m_vertices are default initialized as intended already here
    if (vertices != null)
    {
        m_vertices[0] = vertices?.Item1;
        m_vertices[1] = vertices?.Item2;
        m_vertices[2] = vertices?.Item3;
        m_vertices[3] = vertices?.Item4;
    }
    return this;
}

这只是一个小小的猜测和大量的谷歌搜索,以找出如何写下来。

顺便说一句,

代码语言:javascript
复制
m_vertices[0] = vertices?.Item1 ?? vertices?.Item1 : new Vector4D (0,0,0,0);

不工作;而不是":",我得到一个错误,";“或"}”是预期的。

简单地写

代码语言:javascript
复制
m_vertices[0] = vertices.Item1;

在"if (vertices != null)“语句产生错误之后:(Vector4D,Vector4D)不包含'Item1‘的定义,并且找不到接受类型为'(Vector4D,Vector4D)’的第一个参数的可访问扩展方法'Item1‘。

使用目标系统".NET框架4.7.2“。

在下面Orace的提示下,这可能是(或一种)正确的方法:

代码语言:javascript
复制
public Plane Init (ValueTuple<CVector4D, CVector4D, CVector4D, CVector4D>? vertices = null)
{
    CVector4D[] m_vertices;
    m_vertices = new Vector4D[4];
    // the elements of m_vertices are default initialized as intended already here
    if (vertices != null)
    {
        m_vertices[0] = vertices.Values.Item1;
        m_vertices[1] = vertices.Values.Item2;
        m_vertices[2] = vertices.Values.Item3;
        m_vertices[3] = vertices.Values.Item4;
    }
    return this;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69630947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档