ArchSummit全球架构师峰会门票9折倒计时中~ 了解详情
写点什么

Mono 为 C#添加了类型推断支持

  • 2007 年 7 月 05 日
  • 本文字数:924 字

    阅读完需:约 3 分钟

据 Marek Safar 称,通过使用一种名为类型推断(type inference)的技术, Mono 上的 C# 3.0 编译器现在已经能够支持隐式类型的局部变量以及隐式类型的数组了。

在“类 C”的语言,比如 C#中,我们经常使用类似“type variable = new type”这样略显冗余的办法来创建一个对象。若是变量的类型名称较长,或是会经常变化,那么这样的声明方法更是将显得非常乏味。

借助于最新引入的“var”关键字,C# 3.0 大大减小了这类冗余。通过这样的声明方式,开发者即可在得到动态创建类型便利的同时,也无须牺牲原有的静态类型支持。编译器将通过等号右面的类型信息来确定变量的实际类型。

需要注意的一点是,C#仍旧是早期绑定和静态类型的。类似 Visual Basic 这类延迟绑定(late binding)语言中的一些常见问题(比如由拼写错误造成的“missing method exception”)并不会在 C#中出现。

虽然看上去不错,不过添加类型推断却不只是为了提高开发者的那么一点点输入速度。类型推断是实现匿名类的一个必要的前提条件,而匿名类则在 LINQ 中被广 泛使用。因为匿名类并没有一个指定的类型名称,所以若是没有了类型推断的支持,我们就无法在 C#中创建该类型的实例。(VB 则是通过延迟绑定来实现的这个 功能,不过这也带来了“missing method exception”之类的问题。)

C#中支持两种类型推断:隐式类型变量和隐式类型数组。二者的实现基础完全相同,即在编译时将“var”替换成为分析得到的正确的变量或数组类型表达式。

若是变量的声明和赋值不在同一行书写的话,编译器将不允许我们使用类型推断。虽然从技术角度上考虑,实现这个功能没有什么困难,不过 C#编译器的开发团队可能是为了避免其带来的复杂性,所以并没有考虑支持这个功能。

Marek Safar 还提到了两个无法应用类型推断的场景。

故名思意,“隐式类型局部变量”将无法用于域变量或常量的声明中,否则将导致编译错误。

我无法确定为什么会设置这样的限制,或许我有些地方考虑得也不够全面。

注意:从技术角度考虑,匿名类也拥有类型名称,该类型名称是由编译器自动生成的。不过匿名类的名称却无法预料,因此我们只需要考虑其实现细节。换句话说,我们最好将匿名类的名称当作根本不存在。

查看英文原文: Mono Adds Support For Type Inference in C#

2007 年 7 月 05 日 05:49545
用户头像

发布了 37 篇内容, 共 72083 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

Go-Excelize API源码阅读(十八)——GetPageMargins、SetWorkbookPrOptions、GetWorkbookPrOptions

Regan Yue

Go 开源 源码解析 8月日更 8月月更

语音聊天app源码:系统功能有哪些?

开源直播系统源码

软件开发 直播系统源码 语音直播系统 语音直播

说实话,Hibernate 和 MyBatis 哪个更好用?

TimeFriends

8月月更

图灵访谈 | Vue.js官方团队成员霍春阳:跨专业做程序员,是什么感受?

图灵社区

vue.js 代码人生

SpringBoot 整合 MyBatis-Plus

SpringBoot 2 Mybatis-Plus 8月月更

Spring 全家桶之 Spring Security(二)

小白

8月月更

数据治理(七):Atlas搭建启动

Lansonli

数据治理 8月月更

数据治理几乎所有常见问题的简答都在这里了

雨果

数据治理

JS【数组合并】的性能差异对比

掘金安东尼

JavaScript 前端 8月月更

拿到阿里offer,原因竟是通宵“吃透”了阿里P8纯手写的Java核心笔记

Java技术分享会

Java 程序员 面试 校招 秋招

Spring 全家桶之 Spring Security(三)

小白

8月月更

Spring 全家桶之 Spring Security(五)

小白

8月月更

[教你做小游戏] 用177行代码写个体验超好的五子棋

HullQin

CSS JavaScript html 前端 8月月更

基于STM32的录音机设计(STM32F103+VS1053B)

DS小龙哥

8月月更

从零开始实现一个MyBatis加解密插件

vivo互联网技术

spring mybatis

Spring 全家桶之 Spring Security(四)

小白

8月月更

面试突击76:${} 和 #{} 有什么区别?

王磊

Java 常用面试题

开源一夏 | 大佬,人人都说精通的单例模式,你精通了吗

知识浅谈

单例模式 8月月更

密集计算场景下的 JNI 实战

vivo互联网技术

Java c++ 性能 JVM jni

静态IP是什么意思?和动态IP 有什么区别

郑州埃文科技

静态IP 动态IP IP地址

HMS Core Discovery第17期直播预告|音随我动,秒变音色造型师

HMS Core

AI在游戏反外挂中的应用与实践

AI在游戏反外挂中的应用与实践

Mono为C#添加了类型推断支持_.NET_Jonathan Allen_InfoQ精选文章