【发布时间】:2017-06-12 20:17:30
【问题描述】:
我遇到了这段使用委托并通过引用将函数传递给委托的 C# 代码...
delegate bool MyDel(int x);
static bool fun(int x) {
return x < 0;
}
public static void Main() {
var d1 = new MyDel(fun); // what I usually write
var d2 = new MyDel(ref fun);
}
编译器没有抱怨,并且很好地构建了项目。我在运行一些测试用例时没有发现任何区别,这种语法与通常的语法有什么区别吗?
更新
正如InBetween 所提到的,这个语法似乎也是有效的(而且它更没有意义)
var d3 = new MyDel(out fun);
【问题讨论】:
-
我检查了生成的 IL 并没有发现任何差异。通常传递一个引用,将传递一个引用本身而不是一个指向该引用的指针的副本。
-
@yanyankelevich - 引用类型和引用是两个独立的概念
-
ReSharper 抱怨:无法分配给“有趣”,因为它是一个“方法组”
-
这似乎更像是一个语言怪癖(错误)。
var d2 = new MyDel(ref fun);没有多大意义,但var d2 = new MyDel(out fun);的意义更小,而且也是允许的。 -
这里的 C# 编译器有点过于宽松。它在其他方面与 C 和 C++ 语言中的行为相匹配,在这些语言中引用函数也是无操作的。您可以向 Roslyn 项目提交错误,但这个怪癖已经存在太久而且太天真了,无法产生太多修复它的灵感。如果您仍然想告诉他们,请点击New Issue button。
标签: c# reference delegates ref