.NET 中的 Tuple
的一个很酷的事情是,无需键入:
var x = new Tuple<string, string, int, float, int>("Hi", "Hello", 15, 5.5f, 500);
您可以输入
var x = Tuple.Create("Hi", "Hello", 15, 5.5f, 500);
并且将为您创建正确的通用元组
。
相同的快捷方式对于 Action
和 Func
来说是有益的。由于这似乎对他们来说不可用,因此如何实现它,而不是键入以下内容:
var x = new Action<string, float, int>((s, f, i) => { /* do something */ });
或者更糟糕的是,这个:
var x = new Action<string, float, int>((string s, float f, int i) => { /* do something */ });
你可以输入一些像这样的好东西:
var x = Action.Create((string s, float f, int i) => { /* do something */ });
// x becomes an Action<string, float, int>
虽然长度相同,但后一个例子让参数的含义更加清晰,整体看起来更加整洁。
如何实现这样的扩展方法?请注意,我使用的是 .NET 6.0 和 C# 10.0
最佳答案
从 C# 10 开始,有“natural function types ”。您甚至不需要这样的方法 - 只需直接编写 lambda 并将其分配给 var
,C# 就可以推断委托(delegate)的类型。
var action = (string s, float f, int i) => { ... };
请注意,如果参数太多,这不一定是Action
。 Action
类型的数量有限,最多支持有限数量的参数。
如果你真的想要一个方法,你可以这样做:
var anotherAction = Actions.Create((string s, float f, int i) => { ... });
public static class Actions {
public static T Create<T>(T t) where T: Delegate => t;
}
因为当您调用方法时,自然函数类型也可以工作。
关于c# - 相当于 Actions 和 Func 的 Tuple.Create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76502871/