作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一个将函数作为其参数之一的函数——我以前做过很多次这个任务。这很好用:
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 extendint
. It also ensures that no extension methods are defined on anonymous functions or method groups.
关于c# - 函数的功能在一个方向上起作用,而不是在另一个方向上起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754911/
在这个例子中,我使用的是 flex-direction:row http://jsfiddle.net/9a1d2ddz/ 当空间不足以容纳元素时,出现垂直滚动条 我想达到同样的效果,但采用“从上到下
我是一名优秀的程序员,十分优秀!