【问题标题】:Pass ValueTuple instead of arguments [duplicate]传递 ValueTuple 而不是参数 [重复]
【发布时间】:2019-04-09 08:54:04
【问题描述】:

是否可以这样做(或者我可能需要特定版本的 C#)?

Function<int,int,int,int> triSum = (a,b,c) => {return a+b+c;};
var tup = (1,2,3);
triSum(tup); //passing one tuple instead of multiple args

更新:我的意思是传递元组而不是单独的参数。

public void DoWrite(string s1, string s2)
{
Console.WriteLine(s1+s2);
}
public (string,string) GetTuple()
{
//return some of them
}
//few lines later
DoWrite(GetTuple());

【问题讨论】:

  • 简短的回答是否定的,这不是 C# 内置的。
  • 谢谢,我就是这么问的。
  • 这里的答案和副本都依赖于更改委托签名以更符合您想要完成的任务,但是您在 Python 中找到的 *xxx 参数解包不会存在于 C# 中。
  • 但是,您可以,虽然我不推荐它,但使用这种方法:triSum.DynamicInvoke(Enumerable.Range(0, tup.Length).Select(i =&gt; tup[i]).ToArray()); 我认为这仅适用于 .NET Core 2.x+,不适用于.NET 框架。
  • 哦,真的很丑,正如我所说,我不会推荐它 :)

标签: c# tuples parameter-passing valuetuple


【解决方案1】:

是的,您可以使用 Named ValueTuples C# 7.1 ,如果适合的话,甚至可以只使用 Local Method

Action<(int a, int b, int c)> triSum = t 
   => Console.WriteLine(t.a + t.b + t.c);

triSum((1, 2, 3));

或者只是作为本地方法

void TriSum((int a, int b, int c) t)
   => Console.WriteLine(t.a + t.b + t.c);

TriSum((1, 2, 3));

【讨论】:

  • 我也喜欢你的回答。但是你为什么把Func&lt;int, int, int, int&gt;改成Action&lt;(int, int, int)&gt;呢?
  • @Enigmativity 我相信这最初是一个动作,或者我可能是在想象一些事情
  • 是的,你是对的。
【解决方案2】:

你可以这样做:

Func<(int a, int b, int c), int> triSum = x => { return x.a + x.b + x.c; };

var tup = (1, 2, 3);

var sum = triSum(tup);

或者更简洁地说:

Func<(int a, int b, int c), int> triSum = x => x.a + x.b + x.c;

【讨论】:

  • 支持,因为它可能更符合 OP 的要求
【解决方案3】:

代码有一些错误,总之如下工作:

Func<Tuple<int,int,int>,int > triSum = a => { return a.Item1 + a.Item2 + a.Item3; };
Tuple<int,int,int> tup = new Tuple<int, int, int>(3,4,5);
triSum(tup); //passing one tuple instead of multiple args

上面代码中的问题:

  1. Action 是一个函数委托,它返回void,所以你应该使用Func
  2. 将参数传递给 Action 的方式使它们成为三个独立的整数,而不是元组
  3. 此外,语法 var tup = (1,2) 是从 c# 7.0 开始的,不能在旧版本中使用(不过有一个 nuget 包)

【讨论】:

  • 1.谢谢,修好了。 2. 这是一个主要问题 - 将 valuetuple 传递到等待单独参数的地方。 3. 没问题。我的意思是也许我需要一些 C#8 或特定的包等来实现所要求的行为?
  • @TrolltheLegacy 每个元组都是不同的类型,编译器不可能用具有相同数量整数的元组替换多个整数。您将不得不修改函数定义以使其明确地作为一个元组
  • 这肯定是一个答案。
猜你喜欢
  • 2021-03-10
  • 2013-07-13
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多