要访问ValueTuple成员,我将执行以下操作
public Plane Init (ValueTuple<Vector4D, Vector4D, Vector4D, Vector4D> vertices)
{
Vector4D[] m_vertices = new Vector4D [4];
m_vertices[0] = vertices.Item1;
// etc
return this;
}我可以使用一个可以为空的ValueTuple参数吗?我如何访问它的成员?以下是我尝试过的方法,但不起作用:
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;
}发布于 2021-10-19 12:50:34
要访问Nullable<ValueTuple<>>的项,应该使用Null-conditional operators ?.运算符,如果是null,则使用null-coalescing operator ??来提供值:
var v1 = vertices?.Item1 ?? fallBackValue;但是,为了避免多个冗余的null测试,如果元组为null,则应该使用默认值:
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:
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;
}发布于 2021-10-19 13:04:22
通过对ValueTuple类型和值使用简明的C#语法,我们可以这样写:
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,最好将其添加为静态成员
public static Vector4D Origin { get; } = new Vector4D(0, 0, 0, 0);然后,您可以使用Vector4D.Origin访问它。
如果需要可变数量的参数,请使用params参数:
public Plane Init(params Vector4D[] vertices)
{
Vector4D[] m_vertices = vertices;
}发布于 2021-10-19 12:54:34
我找到了一个最接近我想要的解决方案:
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;
}这只是一个小小的猜测和大量的谷歌搜索,以找出如何写下来。
顺便说一句,
m_vertices[0] = vertices?.Item1 ?? vertices?.Item1 : new Vector4D (0,0,0,0);不工作;而不是":",我得到一个错误,";“或"}”是预期的。
简单地写
m_vertices[0] = vertices.Item1;在"if (vertices != null)“语句产生错误之后:(Vector4D,Vector4D)不包含'Item1‘的定义,并且找不到接受类型为'(Vector4D,Vector4D)’的第一个参数的可访问扩展方法'Item1‘。
使用目标系统".NET框架4.7.2“。
在下面Orace的提示下,这可能是(或一种)正确的方法:
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;
}https://stackoverflow.com/questions/69630947
复制相似问题