C#mono的奇怪编译器错误

好人

我有这个代码:

int? sum=Enumerable.Range(0, 1000).Sum((i) =>
        {
            if (((i % 3) == 0) && ((i % 5) == 0))
                return i;
            return null;
        });

这段代码没有编译,它产生了这个错误:

错误CS0266:无法隐式转换类型“十进制?” 到“ int?”。存在显式转换(您是否缺少演员表?)

我将代码更改为此:

int? sum=Enumerable.Range(0, 1000).Sum<int>((int i) =>
        {
            if (((i % 3) == 0) && ((i % 5) == 0))
                return i;
            return null;
        });

但是编译器错误仍然存​​在。

我不明白,Enumerable.Range返回整数的集合,很明显我想要Sum返回int的整数吗?,否则i应该是decimal,正如我说的,是否插入int之前i没有关系。

当我创建sum一个decimal?变量时,它将进行编译。

我认为这可能是一个单声道错误,在错误列表中没有看到类似的内容

那么,我是否缺少某些东西还是应该提交错误?

我的单声道版本是4.4.1,我的操作系统是Arch linux x64。

用户名

这是一个精简的测试程序,该程序演示了BCL之外的问题:

using System;
using static System.Console;
static class Program {
  static void Test1(Func<int?> f)     { WriteLine("Test1(Func<int?>)");     }
  static void Test1(Func<decimal?> f) { WriteLine("Test1(Func<decimal?>)"); }
  static void Test2(Func<decimal?> f) { WriteLine("Test2(Func<decimal?>)"); }
  static void Test2(Func<int?> f)     { WriteLine("Test2(Func<int?>)");     }
  static void Main() {
    Test1(() => null);
    Test2(() => null);
  }
}

使用Mono(4.4)进行编译时,将输出:

Test1(Func<decimal?>)
Test2(Func<int?>)

当使用Roslyn编译时,将输出:

Test1(Func<int?>)
Test2(Func<int?>)

最终,当通过C#5.0语言规范时,应该选择哪种重载可以归结为7.5.3.3从expression更好的转换,但是不能解决这种情况。它提供了一些特定的方案,其中一种重载要比另一种重载更好,但要使其在这里起作用,就需要对其所谓的推断返回类型进行操作但是,null没有类型。没有推断的返回类型。这使我们在描述要使用的重载的语言规范中一无所获。

5.0语言规范说该调用是模棱两可的。编译器应产生一个错误。

不幸的是,语言规范没有描述Microsoft的编译器。这迫使Mono实现了模仿Microsoft行为的丑陋骇客,因为拒绝编译可以与Microsoft编译器一起编译的代码是一种容易使人们不认真对待Mono的方法,就像您在回答此问题时所看到的那样。 。除非规范正确地描述了他们设计的语言,否则这些丑陋的hacks并不是完美的,而且可能永远也不会完美。

非正式的C#6.0语言规范已在https://github.com/ljw1004/csharpspec/blob/gh-pages/README.md中公开它描述了对重载解析规则的一些调整(寻找7.5.3.3从表达式更好的转换和7.5.3.5更好的转换目标):

  • int?与相比decimal?是更好的转换目标,因为存在从int?的隐式转换decimal?,反之亦然。
  • 因此,Func<int?>是比更好的转化目标Func<decimal?>
  • 因此,从() => null的转换Func<int?>比更好Func<decimal?>

6.0语言规范可能会说代码是有效的,而Roslyn是正确的。但是该语言规范尚未最终确定。

由于C#6.0语言规范尚未最终确定,因此Mono难以准确实现它,而且似乎尚未完成。

无论是将其视为Mono错误或缺少功能的解决方法,还是将其视为与C#5.0更加兼容的代码修复,其结果都是相同的:如史蒂夫(Steve)所建议,使用default(int?)而不是()null也会使这行得通。在C#5.0中,其工作方式是通过为匿名函数提供推断的返回类型int?,从而解决了期望的重载方面的歧义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

奇怪的编译器错误

来自分类Dev

奇怪的编译器错误

来自分类Dev

奇怪的编译器错误

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

简单C链表中的奇怪编译器错误

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

Elm中奇怪的编译器错误

来自分类Dev

Go中奇怪的编译器错误

来自分类Dev

错误:声明为“ <...>”。奇怪的编译器错误

来自分类Dev

C ++,实现函数`int next(std :: string param)`时出现奇怪的编译器错误

来自分类Dev

C编译器错误或程序错误?

来自分类Dev

如何解决奇怪的Haxe编译器错误?

来自分类Dev

奇怪的未声明变量编译器错误

来自分类Dev

C,编译器错误和指针

来自分类Dev

C#-编译器错误

来自分类Dev

c编译器,重叠内存错误

来自分类Dev

Sun c ++编译器的分段错误

来自分类Dev

那是C ++编译器错误吗?

来自分类Dev

编译器错误C2955

来自分类Dev

奇怪的编译问题-未识别的类没有编译器错误

来自分类Dev

C中的分段错误编译器错误

来自分类Dev

在某些C ++编译器上使用限制限定符的编译器错误

来自分类Dev

C ++中的奇数编译器错误(VC编译器)

来自分类Dev

Cmake错误:未知的CXX编译器标识,未知的C编译器标识

来自分类Dev

使用C#mono的WindowsAzure.Storage

来自分类Dev

“-+”运算符c#MONO 2.10.12

来自分类Dev

使用C#mono的WindowsAzure.Storage

来自分类Dev

隐含编译器错误?

来自分类Dev

Swift编译器错误