【发布时间】:2016-05-27 15:19:32
【问题描述】:
在将 Xamarin 项目上的代码提取到运行 Visual Studio 2015.2 的 Win 10 机器中后,我注意到奇怪的编译器特定强制重载解析。我的好奇心最终将我引向了this post,这得到了 Jon Skeet 和 Eric Lippert 的关注,并且在这个主题上提供了非常丰富的信息。
也就是说,我想看看这两个编译器之间的这种差异的最小复制故事是什么,我设法做的是创建以下两个 sn-ps。
我将从 Roslyn 的成功案例开始:
using System;
public static class Program
{
public static void Main() { Foo(Bar); } // Outputs Func
public static void Bar(string input) { Console.WriteLine(input); }
public static string Bar() { return string.Empty; }
public static void Foo(Action<string> input) { input("Action"); }
public static void Foo(Func<string> input) { Console.WriteLine("Func"); }
}
Mono 可以工作的情况:
using System;
public static class Program
{
public static void Main() { Foo(Bar); }
public static void Bar() { Console.WriteLine("Action"); }
public static void Foo(Action input) { input(); }
public static void Foo(Func<string> input) { Console.WriteLine("Func"); }
}
对所用编译器版本的最终回顾:
罗斯林:1.2.0.60425
v12:12.0.31010.0
单声道:4.2.3.0
所以我在这一点上超出了我的深度,我的理解是规范对于如何处理事情的这个特定部分有点模糊。让特定于编译器的代码有效显然不是最好的,所以我可能只需要请求团队成员提供一个 lambda 表达式以避免方法组的歧义,或者至少提供一个显式转换。
Roslyn 案对我来说特别奇怪,因为它的决定似乎是最武断的选择。任何额外的见解将不胜感激。
编辑:
我确实设法找到了一个额外的 sn-p,它可以在 Mono 和 Roslyn 上成功编译,但在 v12 编译器上失败:
using System;
public static class Program
{
public static void Main() { Foo(Bar); }
public static string Bar() { return string.Empty; }
public static void Foo(Action bar) { Console.WriteLine("BAR"); }
public static void Foo(Func<string> input) { Console.WriteLine("Func"); }
}
【问题讨论】:
-
你用的是什么版本的单声道?
-
4.5 x86,mcs 显示 4.0.30319.17020
-
这不是 Mono 版本,而是配置文件版本 (4.5) 和运行时版本 (4.0.30319....)。你必须通过
mono --version查看 -
那只是报告抖动的版本,即4.2.3
-
是的,但是在大多数情况下,Mono 想要遵循 MS.NET 所做的事情,即使后者有点错误或者它的行为超出规范,所以请将不同的行为归档为错误在bugzilla.xamarin.com(现在 xamarin 是 MS 的一部分,他们实际上可能会在 roslyn 中修复它,但他们需要先知道)