2.4.1 C# 和 F# 中的类型推断

728 篇文章 1 订阅
349 篇文章 0 订阅

2.4.1 C# 和 F# 中的类型推断

 

大多数的类型有简称,例如 int 或 Random,只有很少一部分需要类型推断,因为手写类型名称并不困难。C# 2.0 支持泛型,因此,可以构造更复杂的类型。在函数语言中的类型,像 F#,是相当复杂的,尤其是把函数当作值使用,因此,还必须有一种类型来表示函数。

在 C# 3.0 中,可以对局部变量进行简单形式的类型推断。在C# 的早期版本中,声明局部变量必须显式指定类型;在 C# 3.0 中,通常可以用新的关键字 var 代替类型名称。我们来看两个基本的示例:

 

var num = 10;

var str = "Hello world!";

 

第一行声明变量 num,并初始化为 10。编译器很容易就能推断出表达式的右边是 int 类型,因此,变量的类型也必须是 int。注意,此代码的意思与显式写出类型是完全相同样的。在编译期间,C# 编译器用实际类型替换 var,所以,在运行时不需要做额外的工作。我们曾说过,这对于处理复杂泛类型特别有用。例如,我们可以写下面的代码:

 

var dict = new Dictionary<string,List&lt;IComparable&lt;int>&gt;&gt;();

 

如果没有 var 关键字时,就必须在一行上两次指定类型:

■在声明变量时

■创建 Dictionary 类的实例时

在 C# 中的类型推断仅限于局部变量的声明;而F# 中,通常根本不要写出任何类型。只有当 F# 的类型推断无法推断出某种类型时,才需要显式指定类型,但很少出现这种情况。

为了更好地理解其原理,清单 2.5 用一个简单的函数进行演示,它有两个参数,相加,再用 String.Format 方法将结果格式化。清单的前面是有效的 F# 代码,那么,如果C# 中隐式类型被扩展,能够在其他地方使用 var 关键字,该如何写呢?

 

清单2.5 实现有类型推断的方法

 

let add a b =     [1]

  letres = a + b  [2]

  String.Format("{0}+ {1} = {2}", a, b, res)  [3]

 

var Add(var a,var b) {                                                                      |  [4]

  var res = a + b;                                                                             |

  return String.Format("{0} + {1} ={2}", a, b, res);                 |

}

 

可以看到,F# 的语法被设计成,在源代码中根本不必写任何类型[2]。在我们假想的C# 版本中[4],我们用 var 关键字代替所有的类型,(原则上),你输入的这段代码,就是 F# 编译器所看到的。如果将这个函数的代码粘贴到 F# Interactive,会被正确处理,F# Interactive 将报告函数有两个整数作为参数值,并返回一个字符串。我们看看 F# 编译器是如何得出这个结论的。

编译器的第一个线索是,我们要相加的值 a 和 b[2]。在 F# 中,我们可以用 + 对任何数值类型进行相加,或连接字符串,但如果编译器不知道值是什么类型,会假定相加的是两个整数。从这一个表达式来看,编译器可以推断出 a 和 b 都是整数。使用这个信息,可以找到 String.Format 方法对应的重载[3],这个方法返回字符串,因此,编译器可以推断出,add 函数的返回类型也是字符串。

由于有了类型推理,可以避免很多错误,也能使用静态类型的所有其他好处(比如,开发人员编写的代码时的提示),几乎无需付出,因为在大多数情况下,类型是自动推断的。使用 Visual Studio 中的 F#,类型推断在后台运行,因此,当将鼠标指针悬停在某个值上,会立即看到它的类型。后台编译还能即时报告所有的输入错误,因此,能得到写 C# 代码时的相同体验。

如果你习惯使用过其他编程语言的类型,可能已经知道类型包括基元类型(如整数、字符,或浮点数),和由这些基元类型组成的复杂类型。函数语言有一组稍许不同的复合类型,我们会在第五章详细讨论这些类型,现在,我们先讨论一个特别有意义的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值