【问题标题】:How do I r/w access ValueTuple members by index?如何按索引读/写访问 ValueTuple 成员?
【发布时间】:2021-12-06 07:51:52
【问题描述】:

按照我在谷歌上找到的一个例子,我尝试了

我需要在我的cs文件中写入什么才能让ITuple在那里知道吗?我用谷歌搜索了它,没有找到任何东西(也许我是盲人,但是)。

using System.Runtime.CompilerServices;

public class CMatrix
{
    public (CVector r, CVector u, CVector f, CVector t) m_data;

    public CVector this[int i]
    {
        get => ((ITuple) m_data)[i];
        set => ((ITuple) m_data)[i] = value;
    }
}

结果:“类或名称空间名称 'ITuple' 未知”。

我的目标框架是“.NET Framework 4.7.2”。

提示:问题是“我如何使它起作用”,而不是“为什么我的解决方案不起作用”。我发布它只是为了说明我想要实现的目标。

【问题讨论】:

  • ITupleSystem.Runtime.CompilerServices 命名空间中。您可能正在使用不包含 ITuple 的旧运行时版本。你的目标框架是什么?
  • 即使您有权访问ITuple - 它的索引器是只读的,因此您的设置器将无法工作。
  • 问题实际上是“我如何使它工作”,而不是“为什么我的解决方案不起作用”。我的目标框架是“.NET Framework 4.7.2”。
  • 你在哪里找到这个例子?你能分享一个链接吗?
  • 问题是你不能让它工作,特别是设置器,因为ValueTuple(可变的,Tuple 是不可变的)不提供按索引设置项目的方法。当然,你可以做显而易见的事情 (if (i == 0) ... )

标签: c# indexing tuples


【解决方案1】:

正如 cmets 所提到的,没有办法使用索引设置器,据我所知,索引器总是在 .net 4.8 上为 valuetuple 抛出 IndexOutOfRangeException

显而易见的解决方案是编写自己的索引器:

            get =>
                i switch
                {
                    0 => m_data.r,
                    1 => m_data.u,
                    //...
                    _ => throw new ArgumentOutOfRangeException(nameof(i));
                };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2023-03-12
    相关资源
    最近更新 更多