代码之家  ›  专栏  ›  技术社区  ›  IT demon

你能解释一下为什么编译器报告错误CS0826吗?

  •  -1
  • IT demon  · 技术社区  · 2 年前

    当我试图创建一个隐式类型数组时,我得到了这个错误。

    我试图编译以下代码:

    public class Bad
    {
        public static implicit operator Good(Bad bad)
        {
            return new Good();
        }
    }
    
    public class Good
    {
        public static implicit operator Bad(Good bad)
        {
            return new Bad();
        }
    }
    
    class Program
    {
        static void Main()
        {
            var array = new[] { new Good(), new Bad() };
        }
    }
    

    我知道错误的原因:编译器无法选择特定的类型,我应该将数组的某个对象强制转换为另一个对象的类型,在这种情况下这是可行的,但有人能解释为什么编译器不随机将数组强制转换为Good或Bad类型吗?

    因为这将是无用的?或者是因为它在进一步的代码中可能会出错?为什么我一半的新手直觉说它可能有用?

    1 回复  |  直到 2 年前
        1
  •  1
  •   gunr2171    2 年前

    如果不为数组提供显式类型,编译器将尝试根据元素推断类型。如果你这样做

    var arr = new [] { 1, 2, 3 };
    

    因为所有元素都是相同的类型,所以数组就是所有元素的类型。

    如果你有这样的东西

    var arr = new[] { 1.1, 2.2, 3, 4.4 };
    

    编译器发现并非所有元素都是同一类型,但编译器可以采用一种路径,将所有元素隐式转换(或单独保留)为同一类型-双精度,因此数组是双精度,第三个元素隐式强制转换为双精度。

    在您的示例中,编译器发现并非所有元素都是相同的显式类型,因此它会查看所有可能的隐式转换。因为它可以走不止一条路(坏元素->好,好元素->坏),所以它会举手,因为它不知道该怎么办 模棱两可的 。没有 “最佳类型” 因为这两个选项对编译器来说同样可行。

    然而,对于程序员来说,数组变量的类型将影响代码的其余部分,因此需要预先确定。

    有两种方法可以解决此问题:

    1. 从中删除隐式运算符 任何一个 好或坏。这将编译器可以采用的隐式路径减少到只有1条。
    2. 告诉编译器你的意图。
      var array = new Good[] { new Good(), new Bad() };
      // or
      var array = new Bad[] { new Good(), new Bad() };