4 回答
TA贡献1820条经验 获得超9个赞
函数仅返回一个值(即 one Type
),在本例中GetNum
返回 a ValueTuple<int, string>
。
允许该GetLine
方法使用 的返回类型的一种GetNum
方法是编写该方法的重载,该方法接受 a并将传递andValueTuple<int, string>
的结果返回到原始方法:Item1
Item2
public string GetLine((int, string) t) => GetLine(t.Item1, t.Item2);
现在您可以使用一个方法的返回值作为第二个方法的参数:
var result = GetLine(GetNum());
TA贡献1815条经验 获得超6个赞
没有任何 C# 语法可以真正满足您的需求。具有两个参数的方法(例如您的GetLine()方法)需要向其传递两个参数,而 C# 不提供解构元组的方法,除非解构为特定变量。由于方法的参数只是值(按引用参数除外),因此没有变量可用于解构元组。
有很多不同的方法可以做类似的事情。然而,恕我直言,最接近你想做的事情看起来像这样:
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);
TA贡献1828条经验 获得超13个赞
你可以这样做:
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}";
}
为什么这有效?(int, string)函数的 in 参数实际上GetLine是一个类型,就像floator一样double。因此,实际就地解构它是没有意义的。当编写函数参数时,您不应该在那里编写任何逻辑 - 例如,您不能在那里增加一个数字。您只需列出参数类型和参数名称。
TA贡献1993条经验 获得超5个赞
有一个模板——它看起来像:
public static string GetLine(Action<string, int> passedProc, otherParms) // etc
这需要一个过程。
对于一个函数,你可以这样做
public static string GetLine(Function<(string, int)> passedFunc, otherParms) // etc
然后您可以在 GetLine 过程中调用 PassedFunc 并取回元组。
- 4 回答
- 0 关注
- 122 浏览
添加回答
举报