【问题标题】:ValueTuple<(string loanID, decimal x, ...)> does not contain a definition for 'loanID' in c#ValueTuple<(string loanID, decimal x, ...)> 在 c# 中不包含 'loanID' 的定义
【发布时间】:2018-08-28 08:34:15
【问题描述】:

我只是将 ValueTuple 传递给一个函数。我想处理这个 ValueTuple 中的值。

不幸的是,VS 2017 只允许我访问credit.Item1。没有其他项目。到目前为止,我对 ValueTuples 没有任何问题。

编译器中的错误是:

ValueTuple 不包含 “loanID”的定义...

代码是

public void LogCredit(
    ValueTuple<(
        string loanID,
        decimal discount,
        decimal interestRate,
        decimal realReturn,
        decimal term,
        int alreadyPayedMonths)>
    credit)
{
    // not working!
    string loanID = credit.loanID;

    // this is the only thing i can do:
    string loanID = credit.Item1;

    // not working either!
    decimal realReturn = credit.Item2;
}

同时,当悬停在 credit 上时,我可以正确看到它:

有什么建议吗?

【问题讨论】:

  • 看起来您正在尝试将通用语法与 c# 更新的内置元组支持结合起来。如果删除 ValueTuple&lt;&gt; 位会怎样?
  • 我认为您最终会得到一个具有一个匿名成员的元组,该成员的类型是您定义的具有命名元素的元组。
  • 你有一个元组,里面有一个元组,你确定这是你想要的吗?尝试简单地删除ValueTuple&lt;&gt;,看看是否能满足您的需求。 IE。你的方法声明应该是public void LogCredit((string loanID, ...) credit) { ... }
  • 或者,您可以使用正确的字段路径:string loanID = credit.Item1.loanID;
  • 谢谢,成功了。有人想作为答案发布吗?否则我会写下来。

标签: c# tuples valuetuple


【解决方案1】:

您的参数只有一个单一字段Item1,因为它不是ValueTuple&lt;...&gt; 类型,而是ValueTuple&lt;ValueTuple&lt;...&gt;&gt; 类型:外部ValueTuple 的单一类型参数是另一个ValueTuple,其中这个内部@ 987654322@ 现在包含您的 stringdecimalint 字段。 因此,在您的代码中,您必须编写 string loanID = credit.Item1.loanID; 才能访问这些字段。

为了按预期访问您的字段,请删除封闭的ValueTuple,只留下C# tuple

public void LogCredit((string loanID, decimal discount, decimal interestRate,
    decimal realReturn, decimal term, int alreadyPayedMonths) credit)
{
    string loanID = credit.loanID;

    decimal realReturn = credit.Item4;
}

要使用ValueTuple 的命名字段,我更喜欢使用C# 7 Tuples

为了完整起见,这里有一个 general blog article 和一个 in-depth blog article 关于 C# 7 中的元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多