dynamic基元类型
C#编译器允许将一个表达式的类型标记为dynamic。还可以将一个表达式的结果放到一个变量中,并将变量的类型标记为dynamic。
代码使用dynamic表达式/变量来调用一个成员是,编译器会生成特殊的IL代码来描述所需的操作。这种特殊的代码称为payload(有效载荷)。在运行时,payload代码根据当前由dynamic表达式/变量引用的对象的实际类型来决定具体执行的操作。
有时候三元运算符会遇到前后类型不一致的情况。

以下代码使用dynamic进行了演示。
using System;
namespace dynamic
{
internal static class DynamicDemo
{
public static void Main()
{
; demo < ; demo++)
{
dynamic arg = (demo == ) ? (dynamic) : (dynamic)"A";
M(arg);
}
}
private static void M(Int32 n)
{
Console.WriteLine("M(Int32):" + n);
}
private static void M(String s)
{
Console.WriteLine("M(String):" + s);
}
}
}
执行Main时,会得到以下输出:

正常情况下,编译器不允许写代码将一个表达式从Object隐式转型为其他类型,必须使用显示转型。然而,编译器允许使用隐式转型语法将一个表达式从dynamic转型为其他类型:
Object o1 = ; Int32 n1 = o1;//Error Int32 n2 = (Int32);//Ok dynamic d1 = ; Int32 n3 = d1;//Ok
从dynamic转型为其他类型时,虽然编译器允许省略显示转型,但CLR会在运行时验证转型,确保类型安全性得以保持。如果对象的类型不兼容于要转换成的类型,CLR会抛出一个InvalidCastException异常。
dynamic基元类型的更多相关文章
- [CLR via C#]5.4 对象哈希码和dynamic基元类型
原文:[CLR via C#]5.4 对象哈希码和dynamic基元类型 FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处.为此,System.Object提供了虚方 ...
- dynamic基元类型与隐式类型的局部变量var
dynamic代码示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; na ...
- 【CLR Via C#】第5章 基元类型、引用类型、值类型
第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...
- 【C#进阶系列】05 基元类型、引用类型和值类型
基元类型和FCL类型 FCL类型就是指Int32这种类型,这是CLR支持的类型. 而基元类型就是指int这种类型,这是C#编译器支持的,实际上在编译后,还是会被转为Int32类型. 而且学过C的朋友 ...
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...
- [Clr via C#读书笔记]Cp5基元类型引用类型值类型
Cp5基元类型引用类型值类型 基元类型 编译器直接支持的类型,基元类型直接映射到FCL中存在的类型. 作者希望使用FCL类型名称而避免使用关键字.他的理由是为了更加的清晰的知道自己写的类型是哪种.但是 ...
- 重温CLR(四)基元类型、引用类型、值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到framework类型(fcl)中存在的类型. 下表列出fcl类型 从另一个角度,可以认为C ...
- 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型
5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
随机推荐
- 三星Mega 6.3(i9200)删除kingroot
关于kingroot实际效果怎么样,是不是流氓软件,我不做评论. 手机型号,三星galaxy mega 6.3(i9200)水货,更详细的机型不知道怎么看. 刷了官方的rom以后,下载了kingroo ...
- <初级程序员> git 的初级使用
作为程序员,Git 是一个很好的代码管理工具.Git 是一个版本控制系统,主要的作用就是记录代码的修改过程,有效的追踪文件的变化.当代码出现错误的时候可以很容易的恢复到之前的状态,不管对于个人开发还是 ...
- SUID,SGID,Sticky Bit详解(转)
SUID属性 passwd命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码.但是保存用户密码的/etc/shadow文件的权限是400,也就是说只有文件的所有者root用户可以写入, ...
- 由<a>标签的onclick影出来的问题
今天做了一个 通过 document.getElementByName()的方法获得一个标签a的集合.tag_a=window.docu..... 接着需要给每个标签都加一个onclick事件. fo ...
- java多线程机制
多线程使用场景 1.同时需要做两件以上事情时需要开多个线程(例如:上传功能附带进度条显示,一边做上传,一边更新进度条状态.) 2.大量同类型数据需要进行处理(导入导出大量数据) 3.office文档转 ...
- acess the C\c++ from the Java
https://en.wikipedia.org/wiki/Java_Native_Interface http://docs.oracle.com/javase/7/docs/technotes/g ...
- Unity垃圾回收
值类型:内置类型及结构体. 引用类型:对象.字符串.数组. GC的噩梦:连续字符串相加 System.Text.StringBuilder function ConcatExamp ...
- socket、webService、RMI ?
网络七层协议为:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层 webService > RMI > socket RMI比socket更高一点 socket 只是 java在 ...
- java从零到变身爬虫大神(一)
学习java3天有余,知道一些基本语法后 学习java爬虫,1天后开始出现明显效果 刚开始先从最简单的爬虫逻辑入手 爬虫最简单的解析面真的是这样 import org.jsoup.Jsoup; imp ...
- 非ROOT用户启动Tomcat
[root@Z ~]# adduser tomcat [root@Z ~]# chown -R tomcat:tomcat /usr/local/tomcat/ [root@Z ~]# chown - ...