为什么以下代码可以编译通过?

20

我在玩弄我的C#项目时,发现这段代码可以编译通过:

var a = new Action<string>(ref b => b = "hello");

将它反过来,比如 Action<string> a = ref b => b = "hello"; 会在'ref'处产生语法错误。

将这个片段复制粘贴到http://dotnetfiddle.net中,会得到编译器错误:

A ref or out argument must be an assignable variable

我是否遇到了编译器中的错误?(我使用的是VS2015和C#6。)


编辑:刚刚在.NET Fiddle上切换到Roslyn编译器,它仍然会产生相同的错误。


2
我在 tryroslyn 上尝试了一下,是的:它编译通过了 - 行为就像没有 ref 一样。看起来像是一个 bug(如果还没有报告的话可能需要报告)。 - Lucas Trzesniewski
2
@LucasTrzesniewski 的确。我已经在 Roslyn GitHub 仓库 上提交了一个问题。 - James Ko
奇怪。那么语法正确的lambda (ref string b) => b="hello"(请注意括号和类型string),它能被编译器转换为Action<string>吗?我现在无法访问Visual C# 6编译器。 - Jeppe Stig Nielsen
我用@LucasTrzesniewski的链接中的_Try Roslyn_尝试了一下。 - Jeppe Stig Nielsen
2个回答

6

1
不,我的意思是在名为“Visual Studio 2015”的产品编译器中。 - Neal Gafter
“这是一个有意的漏洞,我们保留它以免破坏现有的代码。” - Lucas Trzesniewski

0

我认为在第一个 Action

var a = new Action(ref b => b = "hello");

ref 是完整的 b=>b = "hello" 动作的引用

而在第二个中

Action a = ref b => b = "hello";

refref b => b = "hello"b 的引用

请查看下面的代码 fiddle

2
Action构造函数没有接受引用参数的重载,因此在第一种情况下仍应该是一个错误。 - Jason Watkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接