回家的路上,我想到了一个主意:创建能够允许在c#中使用一些不错语法的Func/Action扩展。
理论上的例子... 创建各种Func/Action的排列方式的扩展,使您可以计时方法的执行。
然而,当我回到家并尝试一个示例时,我发现这是不可能的。我相信这是c#中的一个缺陷/不一致性。委托和方法在理论上是相同的。
public static class Extensions
{
public static void Time(this Action action)
{
// Logic to time the action
action();
}
}
public class Example
{
public void Main()
{
Action action = RunApp;
Action actionLambda = () => { };
Action actionDelegate = delegate () { };
Extensions.Time(RunApp); // Works
Extensions.Time(() => { }); // Works
Extensions.Time(delegate() { }); // Works
Extensions.Time(action); // Works
Extensions.Time(actionLambda); // Works
Extensions.Time(actionDelegate); // Works
action.Time(); // Works
actionLambda.Time(); // Works
actionDelegate.Time(); // Works
((Action) RunApp).Time(); // Works
((Action) delegate () { }).Time(); // Works
((Action) (() => { })).Time(); // Works
// These should all be the same!
RunApp.Time(); // No good: "Example.RunApp() is a method which is not valid in the given context"
() => { }.Time(); // No good: Operator '.' cannot be applied to operand of type 'lambda expression'"
(() => { }).Time(); // No good: Operator '.' cannot be applied to operand of type 'lambda expression'"
delegate() { }.Time(); // No good: "Operator '.' cannot be applied operand of the type 'anonymous method'"
}
public void RunApp()
{
// Stuff...
}
}
我知道Func/Action是相对于委托和方法组而言较新的添加,但它们为什么不能完全具备相同的功能呢?
((Action)(() => { })).Time();
。 - Keith Nicholas