5.4.3.1 C# 3.0 中的类型推断
在 C# 中,值类型推断主要用 var 关键字表示,这是 C# 3.0 的新功能。我们前面已经看到,但通过清单 5.12 的几个例子,我们可以更详细地讨论一下。
清单 5.12 使用 var 关键字进行类型推断 (C#)
var num = 10 + (2 * 16);
var str = String.Concat(new string[]{"Hello ", "world!"});
var unk = null; [1] 错误
类型推断机制是主要看赋值运算符的右边,得出表达式的类型。即使不使用 var,也要这样做,以确保要赋给的变量与要赋的值相兼容。示例的最后一行[1],C# 编译器无法推断类型,报告错误消息。文字 Null 可以隐式转换成任何 .NET 引用类型(甚至是可空的值类型),而它本身并不是真正的 .NET 类型。编译器不知道我们想给变量 unk 哪种类型,因此,必须显式指定类型。我们早先在 option 类型中使用过 var 关键字,那么,就来详细分析几个示例:
var s1 = Option.Some<int>(10);
var s2 = Option.Some(10);
var n1 = Option.None<int>();
var n2 = Option.None();
第一和第三行并出人意料,我们调用泛型方法,并显式指定了类型参数值,因此,编译器可以推断出返回类型;第二行,我们没有为方法指定类型参数值,但编译器知道第一个参数值的类型必须与类型参数值兼容,因此,正确推断出要创建的值类型为Option<int> 2;最后一行,会报错“不能从方法 '… ' 的用法推断出它的类型参数。”这是因为,在这里,编译器没有足够的线索,知道应该是什么类型。
在 C# 中的类型推断在很多方面都是有限制的,但仍然非常有用;在 F# 中,算法更智能,能够推断出更多的类型。下面,我们看一些 F# 示例。
5.4.3.2 F# 中的类型推断