【问题标题】:Why does the following code compile without errors?为什么下面的代码编译没有错误?
【发布时间】:2016-02-09 08:09:30
【问题描述】:

我的 C# 项目有点乱,看到这段代码编译我很惊讶:

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

反过来,如Action&lt;string&gt; a = ref b =&gt; b = "hello"; 将在“ref”处产生语法错误。

果然,将 sn-p 复制粘贴到 http://dotnetfiddle.net 会导致编译器错误:

A ref or out argument must be an assignable variable

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


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

【问题讨论】:

  • 我在tryroslyn 尝试过,是的:它可以编译 - 行为与ref 不存在时的行为相同。看起来像一个错误(如果尚未完成,可能应该报告)。
  • @LucasTrzesniewski 确实如此。我已经向Roslyn GitHub repo 提交了一个关于此的问题。
  • 奇怪。语法正确的 lambda (ref string b) =&gt; b="hello"(注意括号和类型 string)怎么样,可以使用该编译器将其转换为 Action&lt;string&gt; 吗?我现在无法访问 Visual C# 6 编译器。
  • ...我用@LucasTrzesniewski 的链接中的 Try Roslyn 进行了尝试。

标签: c# compiler-errors delegates roslyn ref


【解决方案1】:

这听起来像是 VS2015 中的编译器错误。归档为https://github.com/dotnet/roslyn/issues/6646

【讨论】:

  • 不,我的意思是在名为“Visual Studio 2015”的产品的编译器中。
  • “这是我们故意维护的错误,以免破坏现有代码。”。说什么? :-\
【解决方案2】:

我认为首先Action

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

ref 是完整操作的参考b=&gt;b = "hello"

第二个

动作 a = ref b => b = "hello";

ref 是 ref b => b = "hello" 中 b 的参考

检查以下 fiddle

【讨论】:

  • Action 构造函数没有采用 by ref 参数的重载,因此在第一种情况下应该仍然是错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
相关资源
最近更新 更多