浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)
C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢?
从最简单的示例开始:
static void Main(string[] args)
{
dynamic dyn = ;
object obj = ; //在编译时将鼠标放到 ”dyn” 和”obj”中可以发现:
// dyn:局部变量 dynamic (dyn)
// obj: 局部变量object (obj)
System.Console.WriteLine(dyn.GetType());
System.Console.WriteLine(obj.GetType());
}
运行这段代码将显示 dyn 和obj 的运行时类型:
System.Int32
System.Int32
在WriteLine方法后面增加两行:
dyn = dyn + 3;
obj = obj + 3;
编译:

可以看到对于表达式 obj +3 ,编译器器报告了错误,但是不会报 dyn+3 编译。
编译器不会检查包含dyn的表达式,原因在于 dyn 是 dynamic。
类型转换
修改Main代码如下:
dynamic dyn = (dynamic)1;
int j = (int)dyn;
可以看到1被强制转换成dynamic,然后又被强制转换回int.
然而dynamic可以隐式的转换成任何类型,并且也可以从其他类型中转换回来,
所以上面的代码和下面的等价:
dynamic dyn = 1;
int j = dyn;
修改Main代码增加如下代码:
//下面这句话会无法通过编译,typeof 运算符无法用在动态类型上
//Console.WriteLine(typeof(dynamic));
Console.WriteLine(typeof(List<dynamic>));
如果你是typeof(dynamic)会报typeof运算符无法用在动态类型上的错误,
但是如果你写的是List<dynamic> 那么输出结果如下:
可以看到输出时System.Object。
微软对此的解释是:
在大多数情况下, dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。
浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)的更多相关文章
- 浅谈ASP.NET ---- 系列文章
[01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...
- 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject
http://www.cnblogs.com/LoveJenny/archive/2011/07/05/2098578.html ExpandoObject:表示一个对象,该对象包含可在运行时动态添加 ...
- 浅谈游标选项 Static|Keyset|DYNAMIC|FAST_FORWARD
接好久之前太监的一篇Blog.现在补充几个选项的介绍 所用的语句都是这个 IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 GO CREATE TABLE T1 ...
- 浅谈Static关键字
1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...
- 浅谈 var 关键字
提起 var关键子,程序员的第一反应就是JavaScript, 事实上这个关键子在其他语言中也有被采用. 比如说C#, 比如说kotlin, 用法和JavaScript中使用差不多,作为要声明变量的前 ...
- 浅谈this关键字
在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法, 供大家参考,代码里面有我总结的分析过程! 箭头函数里的this: var username = "全局"; ...
- 浅谈final关键字的用法
1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...
- 浅谈javascript-this关键字
前言 JavaScript中this变量是一个令人难以摸清的关键字,当初学习javascript的时候被这个this指向问题折腾的我是惨不忍睹,漏洞百出.一度想在后面的代码过程中放弃对this的使用, ...
- 浅谈transient关键字
1,用途 当一个对象实现了Serilizable接口,这个对象就可以被序列化.而有时候我们可能要求:当对象被序列化时(写入字节序列到目标文件)时,有些属性需要序列化,而其他属性不需要被序列化,打个比方 ...
随机推荐
- ASP.NET MVC几种找不到资源的问题解决办法
转自:http://www.cnblogs.com/xyang/archive/2011/11/24/2262003.html 在MVC中,controller中的Action和View中的.csht ...
- 控制台程序实现利用CRM组织服务和SqlConnection对数据库中数据的增删改查操作
一.首先新建一个控制台程序.命名为TestCol. 二.打开App.config在里面加入,数据库和CRM连接字符串 <connectionStrings> <add name=&q ...
- 正在调用的 ServicedComponent 配置不正确(请使用 regsvcs 重新注册)
问题: 正在调用的 ServicedComponent 配置不正确(请使用 regsvcs 重新注册) 方法1: 我用的是64位操作系统.IIS中,启用32位应用程序设置为false.这样就可以了 ...
- [java] JNLP文件安装
JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个java应 ...
- JSP--监听HTTP会话
来源: <http://www.cnblogs.com/eflylab/archive/2007/01/16/621953.html> ServletListener 之 监听HTTP会话 ...
- 【jmeter】ANT批量执行Jmeter脚本
一.环境准备: 1.Jdk1.6或以上:命令行输入:java -version,出现如下提示说明安装成功 2.ANT下载:http://ant.apache.org/bindownload.cgi 命 ...
- JavaScript中的继承模式总结
一.总结: //js中的几种继承 //原型链的问题,包含引用类型的原型属性会被实例共享,子类型无法给超类型传递参数 function SuperType() { this.colors = [&quo ...
- sql在添加新列时同时指定default约束名称
alter table tab_testadd col_test NOT NULL CONSTRAINT DFtab_test_col_test DEFAULT 1 引用:http://www.uzz ...
- lwip初始化过程
首先应该看下源码包中的doc/rawapi.txt,这篇文档中介绍了初始化流程. 初始化过程的前半部分主要针对lwip的内存管理和各个协议层,在src/core/init.c中有一个lwip_init ...
- bzoj4637: 期望
Description 在米国有一所大学,名叫万国歌剧与信息大学(UniversalOperaandInformaticasUniversity).简称UOI大学.UO I大学的建筑与道路分布很有趣, ...