【问题标题】:How good is the C# type inference?C# 类型推断有多好?
【发布时间】:2010-10-03 13:16:51
【问题描述】:

C# 类型推断有多好?我在某处读到它仅适用于局部变量?它适用于类级别属性吗?对于方法签名?方法返回类型?等等

【问题讨论】:

    标签: c# .net type-inference


    【解决方案1】:

    C# 中有几种主要的类型推断:

    • 隐式类型的局部变量:

      • 仅适用于局部变量
      • 仅当值作为声明的一部分赋值时
      • 值不能为空
      • 值不能是 lambda 表达式、匿名方法或方法组(没有强制转换)
      • 值的编译时类型用于变量的类型
      • 仅根据初始声明+赋值确定的类型检查变量的任何进一步使用;它们对推理本身没有贡献。
    • 泛型方法类型参数推断,即您没有在调用泛型方法时指定类型参数,编译器会根据参数计算出来。

      • 将它用于泛型类型和泛型方法会非常方便
      • 无论如何真的很方便 - 没有它 LINQ 将很难或无法使用
      • 没有它,匿名类型将毫无用处
      • 非常复杂的规则,甚至规范在一些地方是错误的
    • Lambda 表达式参数类型推断

      • 编译器尝试根据使用的上下文计算 lambda 表达式的参数类型
      • 根据我的经验,通常效果很好
    • 数组类型推断,例如new[] { "Hi", "there" } 而不是 new string[] { "Hi", "there" }

      • 各种小限制,没什么大不了的

    我可能忘记了一些其他可能被称为“类型推断”的功能。我怀疑您最感兴趣的是第一个,但其他可能也与您相关:)

    【讨论】:

      【解决方案2】:

      它只能用于局部变量,但它可以检测多种不同形式的类型。

      var myVar = SomeMethodThatReturnsInt(); //will know it's an int
      var myIntList = new List<int>(); //this works too (although this is technically not type inference)
      var myOwnVar = new { Name = "John", Age = 100 }; // will create own type and infer that
      

      编辑:Tye 推理的另一个例子是 Lambdas。即:

      var myList = new List<int>();
      //add some values to list
      
      int x = myList.Find(i => i == 5); // compiler can infer that i is an int.
      

      【讨论】:

      • 为什么第二个例子在技术上不是类型推断?
      • +1 给 Rafa Castaneda。为什么第二个例子不是类型推断的例子?在我看来,它确实很像!
      【解决方案3】:

      据我所知,它仅适用于局部变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 2018-05-15
        相关资源
        最近更新 更多