代码之家  ›  专栏  ›  技术社区  ›  thr

C#类型推理有多好?

  •  20
  • thr  · 技术社区  · 16 年前

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

    3 回复  |  直到 13 年前
        1
  •  45
  •   Jon Skeet    16 年前

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

    • 隐式类型的局部变量:

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

      • 对于泛型类型和泛型方法来说,这将非常方便
      • 不管怎样,这真的很方便——没有它,LINQ很难或不可能使用
      • 没有它,匿名类型将毫无用处
      • 非常复杂的规则,甚至规范在某些地方也有错误
    • Lambda表达式参数类型推断

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

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

    我可能忘记了其他一些可能被称为“类型推理”的功能。我怀疑你主要对第一个感兴趣,但其他可能也与你有关:)

        2
  •  7
  •   meJustAndrew    8 年前

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

    var myVar = SomeMethodThatReturnsInt(); // `myVar` will be deduced as an `int`.
    var myIntList = new List<int>(); // `myIntList` will be deduced as a List<int>.
    var myOwnVar = new { Name = "John", Age = 100 }; // `myOwnVar` will be deduced as an AnonymousType.
    

    注意:当你使用匿名类型时,你 必须 用声明变量 var .

    使用Lambda表达式进行类型推断的另一个示例:

    var myList = new List<int>();
    // <add values to list>
    int x = myList.Find(i => i == 5); // `i` will be deduced as an `int`.
    
        3
  •  1
  •   EricSchaefer    16 年前

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