Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将函数调用作为参数传递给另一个函数时,如何解构该函数调用_C# - Fatal编程技术网

C# 将函数调用作为参数传递给另一个函数时,如何解构该函数调用

C# 将函数调用作为参数传递给另一个函数时,如何解构该函数调用,c#,C#,我想将一个返回两个值的函数传递给另一个函数,该函数需要相同的两个值作为参数。在下面的示例中,我想将GetNum传递给GetLine public class Program { public static void Main() { Console.WriteLine(GetLine(GetNum())); } public static (int,string) GetNum() => (5,"five"); public s

我想将一个返回两个值的函数传递给另一个函数,该函数需要相同的两个值作为参数。在下面的示例中,我想将GetNum传递给GetLine

public class Program
{
    public static void Main()
    {
        Console.WriteLine(GetLine(GetNum()));
    }   
    public static (int,string) GetNum() => (5,"five");
    public string GetLine(int n , string s) => $"{n} {s}";
}

有什么C#语法可以帮助我吗?

你可以这样做:

public static void Main()
{
    Console.WriteLine(GetLine(GetNum()));
}   
public static (int,string) GetNum() => (5,"five");
public static string GetLine((int, string) a) {
    var (number, text) = a;
    return $"{number}, {text}";
}
static class Extensions
{
    public static TResult CallDeconstructed<T1, T2, TResult>(this (T1, T2) tuple, Func<T1, T2, TResult> func)
    {
        return func(tuple.Item1, tuple.Item2);
    }
}
public static void Main()
{
    //Console.WriteLine(GetLine(GetNum()));
    Console.WriteLine(GetNum().CallDeconstructed(GetLine));
}
public static (int, string) GetNum() => (5, "five");
public static string GetLine(int n, string s) => $"{n} {s}";

为什么这样做有效?
GetLine
函数的参数中的
(int,string)
实际上是一种类型,就像
float
double
一样。因此,实际上就地解构它是没有意义的。在编写函数参数时,您不需要在那里编写任何逻辑-例如,您不能在那里增加一个数字。您只需要列出参数类型和参数名称。

有一个模板,它看起来像:

 public static string GetLine(Action<string, int> passedProc, otherParms) // etc
公共静态字符串GetLine(Action passedProc,otherParms)//等
这需要一个过程

对于一个函数,你是这样做的

 public static string GetLine(Function<(string, int)> passedFunc, otherParms) // etc
公共静态字符串GetLine(函数passedFunc,otherParms)//等

然后,您可以在GetLine过程中调用passedFunc并返回元组。

函数只返回一个值(即一个
类型
),在这种情况下,
GetNum
返回的是
值元组

允许
GetLine
方法使用返回类型
GetNum
的一种方法是编写方法重载,该重载接受
ValueTuple
,并将传递
Item1
Item2
的结果返回给原始方法:

public string GetLine((int, string) t) => GetLine(t.Item1, t.Item2);
现在可以使用一个方法的返回值作为第二个方法的参数:

var result = GetLine(GetNum());
没有一种C#语法能真正做到你想要的。具有两个参数的方法,例如
GetLine()
方法,需要向其传递两个参数,而C#不提供解构元组的方法,除非将元组分解为特定变量。由于方法的参数只是值(按引用参数除外),因此没有变量可用于解构元组

做类似的事情有很多不同的方法。然而,最接近你想要做的事情看起来是这样的:

public static void Main()
{
    Console.WriteLine(GetLine(GetNum()));
}   
public static (int,string) GetNum() => (5,"five");
public static string GetLine((int, string) a) {
    var (number, text) = a;
    return $"{number}, {text}";
}
static class Extensions
{
    public static TResult CallDeconstructed<T1, T2, TResult>(this (T1, T2) tuple, Func<T1, T2, TResult> func)
    {
        return func(tuple.Item1, tuple.Item2);
    }
}
public static void Main()
{
    //Console.WriteLine(GetLine(GetNum()));
    Console.WriteLine(GetNum().CallDeconstructed(GetLine));
}
public static (int, string) GetNum() => (5, "five");
public static string GetLine(int n, string s) => $"{n} {s}";
综上所述,我不确定任何替代方案(包括上述)是否真的比在调用站点编写中间代码好得多:

(int n, string s) = GetNum();
GetLine(n, s);

我认为他实际上想解构函数参数中的元组(而不是函数体)。他用来问这个问题的措辞有点让人困惑。如果你有一个元组参数,这是没有意义的,但是如果你有多个非元组参数,比如OP的例子,这是有意义的。不过,仅仅因为它有意义并不意味着C#会让你这么做。看起来在这一点上,唯一的选择就是按照你所描述的那样去做。如果您有一个现有的方法,而不必编写重载,比如
publicstaticstringgetline((int-number,stringtext)a)=>GetLine(a.number,a.text)
@itsme86没关系——我想我不明白你的评论