gpt4 book ai didi

c# - 函数的功能在一个方向上起作用,而不是在另一个方向上起作用

转载 作者:太空狗 更新时间:2023-10-29 21:40:52 25 4
gpt4 key购买 nike

我正在尝试编写一个将函数作为其参数之一的函数——我以前做过很多次这个任务。这很好用:

int RunFunction(Func<int,int> f, int input) {
return f(input);
}
int Double(int x) {
return x*2;
}

// somewhere else in code
RunFunction(Double,5);

但这不起作用:

public static class FunctionyStuff {
public static int RunFunction(this Func<int,int> f, int input) {
return f(input);
}
}

// somewhere else in code
Double.RunFunction(5);

知道为什么第一个有效而第二个无效吗?

最佳答案

第一个版本正在执行方法组转换 作为“参数到参数”匹配的一部分。扩展方法不会发生这种转换。 lambda 表达式也是如此——你不能这样写:

((int x) = > x * 2).RunFunction(10);

要么。

C# 4 规范的第 7.6.5.2 节提供了扩展方法调用的详细信息。它首先要求方法调用具有以下形式之一:

expr.identifier ( )
expr.identifier ( args )
expr.identifier < typeargs > ( )
expr.identifier < typeargs > ( args )

然后在此规则中使用表达式 (expr) 的类型:

An extension method Ci.Mj is eligible if

  • [...]
  • An implicit identity, reference, or boxing conversion exists from expr to the type of the first parameter of Mj.

然后,规范的注释版本包含 Eric Lippert 的评论:

This rule ensures that making a method that extends double does not also extend int. It also ensures that no extension methods are defined on anonymous functions or method groups.

关于c# - 函数的功能在一个方向上起作用,而不是在另一个方向上起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754911/

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