gpt4 book ai didi

c# - 为什么方法不能像 func/action 委托(delegate)那样在语法上工作?

转载 作者:太空狗 更新时间:2023-10-29 22:00:11 25 4
gpt4 key购买 nike

<分区>

在回家的路上我有了一个想法:创建 Func/Action 扩展,这将允许在 c# 中使用一些不错的语法糖。

理论示例...为 Func/Action 的各种排列创建扩展,允许您为方法的执行计时。

当我回到家尝试一个例子时,我发现这是不可能的。我认为这是 c# 中的一个缺点/不一致。委托(delegate)和方法是同一个(理论上)。

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...
}
}

我知道与委托(delegate)和方法组相比,Func/Action 是对 c# 的新添加,但为什么它们的行为不尽相同?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com