【发布时间】:2016-01-14 00:39:48
【问题描述】:
例如,我发现自己一直想传递带有返回且没有输入的 Func 来代替 Action
Func<int> DoSomething = ...;
Task.Run(DoSomething);
哪里,我并不关心DoSomething的返回值。
然而,这些类型并没有统一,我最终将调用包装起来
Task.Run(() => { DoSomething(); });
有没有办法让这些类型统一而不用包装?另外,它们不统一是否有很好的设计原因?
【问题讨论】:
-
如果 C# 被设计成某种 Unit 类型而不是
void,他们可以统一。那么Action就是Func<Unit>。 -
如果您发现自己经常将
Func传递为Action,为什么不使用F#?与 C# 不同,它从头开始设计为一种函数式语言。 C# 只是背负了过去功能不强的许多包袱。正如void所证明的那样,以及带有多个参数的函数,例如:P 如果您只是想简化代码,只需为自己创建一些AsAction扩展方法,就可以了。 -
Task.Run(DoSomething);有什么问题?它会返回Task<int>,它仍然是Task。当您致电Task.Run(Action)时,您会得到什么? -
@SriramSakthivel - 它看起来不像一个类型,它也不像一个类型,所以根据鸭子打字(双关语),它不是一个类型:D
-
@SriramSakthivel:
System.Void仅用于反射。就语法而言,C# 中的void绝对不是一种类型。语法中每个需要类型的地方都有void的特殊情况(除非void是不允许的,例如在类型参数中)。
标签: c# types anonymous-function unification