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(转)的更多相关文章

  1. 浅谈ASP.NET ---- 系列文章

    [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...

  2. 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject

    http://www.cnblogs.com/LoveJenny/archive/2011/07/05/2098578.html ExpandoObject:表示一个对象,该对象包含可在运行时动态添加 ...

  3. 浅谈游标选项 Static|Keyset|DYNAMIC|FAST_FORWARD

    接好久之前太监的一篇Blog.现在补充几个选项的介绍 所用的语句都是这个 IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 GO CREATE TABLE T1 ...

  4. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  5. 浅谈 var 关键字

    提起 var关键子,程序员的第一反应就是JavaScript, 事实上这个关键子在其他语言中也有被采用. 比如说C#, 比如说kotlin, 用法和JavaScript中使用差不多,作为要声明变量的前 ...

  6. 浅谈this关键字

    在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法, 供大家参考,代码里面有我总结的分析过程! 箭头函数里的this: var username = "全局"; ...

  7. 浅谈final关键字的用法

    1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...

  8. 浅谈javascript-this关键字

    前言 JavaScript中this变量是一个令人难以摸清的关键字,当初学习javascript的时候被这个this指向问题折腾的我是惨不忍睹,漏洞百出.一度想在后面的代码过程中放弃对this的使用, ...

  9. 浅谈transient关键字

    1,用途 当一个对象实现了Serilizable接口,这个对象就可以被序列化.而有时候我们可能要求:当对象被序列化时(写入字节序列到目标文件)时,有些属性需要序列化,而其他属性不需要被序列化,打个比方 ...

随机推荐

  1. Asp.net获取用户真实Ip地址

    /// <summary> /// 获取远程访问用户的Ip地址 /// </summary> /// <returns>返回Ip地址</returns> ...

  2. 【转】Deprecated: Function ereg_replace() is deprecated的解决方法

    这个问题是因为你用的php版本过高. 在php5.3中,正则函数ereg_replace已经废弃,而dedecms还继续用.有两个方案可以解决以上问题: 1.把php版本换到v5.3下. 2.继续使用 ...

  3. java找jar包、搜索class类 搜索maven

    sourceforge.net https://github.com/ http://www.findmaven.net/搜索class类 http://mvnrepository.com/

  4. ClassNotFoundException异常的解决方法

    java.lang.ClassNotFoundException 说是某个类没有找到,找了下,发现这个类是在项目里面的,那么久奇怪了,为什么应用找不到这个类, 然后用mvn install -Dmav ...

  5. Android.mk文件语法规范 原文

    序言:------------- 此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件.为了明白下面的内容,你必须已经阅读 ...

  6. js跨域--服务器端设置

    首先低版本浏览器是不支持的,我从网上搜的是[IE8.Firefox 3.5 及其以后的版本.Chrome浏览器.Safari 4 等已经实现了] 下面主要是针对服务器端设置Access-Control ...

  7. windows 系统中打开一个数字证书所经历的过程

         今天在使用Outlook express调试CSP程序时,发现数字证书总是加载不上(提示该数字证书已经被破坏),使用断点进去跟踪一下,发现在CSP程序中调用CPVerifySignature ...

  8. WPF--Calendar控件高级使用

    一.得到当前显示的月份: DateTime SelectedDay = this.MC.DisplayDate; 二.得到当前选中的天,得到当前选中的周,得到当前显示的月份: 如果你使用系统默认的事件 ...

  9. 使用 Windows PowerShell 来管理和开发 windowsazure.cn 账户的特别注意事项

    6月6日,微软面向中国大陆用户开放了Microsoft Azure公众预览版的申请界面.大家可以申请免费的 beta 试用,收到内附邀请码的通知邮件后只需输入激活码即可开始免费试用.具体网址为: ht ...

  10. Python-While刷博爬虫

    仅用于测试 #!/usr/bin/python import webbrowser as web import time import os url = 'www.abc.com' while Tru ...