C#类型推断有多好?

时间:2009-01-26 14:04:55

标签: c# .net type-inference

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

3 个答案:

答案 0 :(得分:40)

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

  • 隐式输入的局部变量:

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

    • 对于泛型类型以及泛型方法而言,这样做非常方便
    • 无论如何真的很方便 - 没有它就很难或不可能使用LINQ
    • 如果没有它,匿名类型将毫无用处
    • 规则真的很复杂,即使规格在一些地方也是错误的
  • Lambda表达式参数类型推断

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

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

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

答案 1 :(得分:7)

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

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。 IE:

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.

答案 2 :(得分:1)

根据我的理解,它仅适用于局部变量。