【发布时间】:2014-08-10 13:22:52
【问题描述】:
当我遇到这种特殊情况时,我正在实现同步/异步重载:
当我有一个不带参数或返回值的常规 lambda 表达式时,它会使用 Action 参数进入 Run 重载,这是可以预测的。但是,当该 lambda 中包含 while (true) 时,它会使用 Func 参数进行重载。
public void Test()
{
Run(() => { var name = "bar"; });
Run(() => { while (true) ; });
}
void Run(Action action)
{
Console.WriteLine("action");
}
void Run(Func<Task> func) // Same behavior with Func<T> of any type.
{
Console.WriteLine("func");
}
输出:
动作
函数
那么,怎么可能呢?有什么原因吗?
【问题讨论】:
-
有趣。看起来你对任何
Func<T>类型也有相同的行为。我尝试了Func<int>和Func<string>,结果相同。 -
@L.B 他在询问重载解决方案。他意识到他没有给代表打电话。
-
奇数。将其更改为
while (false) ;,它被视为Action。 -
摆脱重载解决方案。这个问题可以简化为是什么让
Func<Any T> func = () => { while(true) ; };编译。 -
@AnthonyPegram:不,重载解决方案很重要。如果你取出
Func重载它仍然可以编译(打印“action” x 2),但如果你取出Action一个它不会。所以有一些东西使无限循环更喜欢Func重载而不是Action。
标签: c# .net lambda overloading overload-resolution