枚举Enum和常量0之间的恩怨
1,任何为0的常量表达式都能隐式的转换成枚举Enum。
对于这一点,在程序中没少吃苦头。特别是对于函数重载的情况,往往让人一头雾水。
看看下面的代码(摘自MSDN),你能猜到输出吗?
public enum E
{
Zero = ,
One = ,
} class A
{
public A(string s, object o)
{ System.Console.WriteLine("{0} => A(object)", s); } public A(string s, E e)
{ System.Console.WriteLine("{0} => A(Enum E)", s); }
} class B
{
static void Main()
{
A a1 = new A("", );
A a2 = new A("", );
A a3 = new A("(int) E.Zero", (int) E.Zero);
A a4 = new A("(int) E.One", (int) E.One);
}
}
Visual C# output:
=> A(Enum E)
=> A(object)
(int) E.Zero => A(object)
(int) E.One => A(object) Visual C# output:
=> A(Enum E)
=> A(object)
(int) E.Zero => A(Enum E)
(int) E.One => A(object)
自VS2008起,所有能确定为0的常量表达式都能隐式的转换成Enum。
所以如果不想要这种隐式的转换的话,在程序中处理0时,就需要转换。
再来看看我的测试例子:
namespace WZTEST
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} public void SqlParameter(string parameterName, object value)
{
//object
} public void SqlParameter(string parameterName, SqlDbTypeA dbType)
{
//Enum
} private void button1_Click(object sender, EventArgs e)
{
const int ZERO = ;
SqlParameter("aa", );
SqlParameter("aa", (int));
SqlParameter("aa", ZERO);
SqlParameter("aa", Convert.ToInt32());
}
} public enum SqlDbTypeA
{
Int =
}
}
我们来反编译下button1_Click函数,看看编译器都做了什么。
private void button1_Click(object sender, EventArgs e)
{
this.SqlParameter("aa", (SqlDbTypeA) );
this.SqlParameter("aa", (SqlDbTypeA) );
this.SqlParameter("aa", (SqlDbTypeA) );
this.SqlParameter("aa", Convert.ToInt32());
}
傻眼了吧!前面三个全部变成了Enum。好吧,既然斗不过微软,那就只有接受这个结果。
结论:对于有Enum的重载函数,传入0时,最好用Convert转换;或者用一个变量赋值0后再传入函数,以避开万恶的编译器规则。
备注:微软这样做的原因是Enum和0之间的比较比较频繁,为了方便开发者,就做了这样的隐式转换;但却给函数重载留下隐患,稍不小心就会犯错。
枚举Enum和常量0之间的恩怨的更多相关文章
- Java 枚举(enum) 详解7种常见的用法
Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...
- 【转】结构struct 联合Union和枚举Enum的细节讨论
结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...
- 【C#基础概念】枚举 (enum详解)
我们重点来讲解 简单枚举和标志枚举的用法和区别 继承 Object-> ValueType ->Enum Object-> ValueType ->struct 包括int f ...
- 又爱又恨系列之枚举enum
其实枚举挺简单的,只不过以前没好好学,所以不知道这个东西,恩,现在梳理一下 整体而言,首先枚举是一个数据类型,这个数据类型和结构体有点像 可以分为三个层次 1.枚举数据类型定义 第一种:enum 枚举 ...
- [未完成]关于枚举(Enum)
今天总结一下枚举相关的知识.先附一段关于枚举的代码: package org.talend.core.model.param; import org.talend.core.i18n.Messages ...
- 【 枚举 Enum 】循环 名称与值
foreach (WeekDay c in (WeekDay [])Enum.GetValues(typeof(WeekDay ))) {Console.Write(String.Format(& ...
- 枚举enum学习小记
参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社 ...
- JAVA—枚举(Enum)学习总结
1.枚举(Enumeration) 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式.这种传统接口已被迭代器取代,虽然Enumeration 还未被遗弃,但在现代代码 ...
- java枚举(enum)
1. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum (抽象类) 类的子类. enum AccountType { SAVING, FIXED, CURRE ...
随机推荐
- SQL 给字符串补0
第一种方法: right('00000'+cast(@count as varchar),5) 其中'00000'的个数为right函数的最后参数,例如这里是5,所以有5个0 @count就是被格式化 ...
- maven配置src/resources默认目录
在maven工程中,我们会将配置文件放到,src/main/resources 下面,例如 我们需要确认resource 下的文件 编译之后存放的位置 它编译的路径直接位于classes下面,这个 ...
- 图数据库titan 和 rexster安装手册
titan是图数据库, rexster是图显示服务 titan 安装 下载 titan 0.3.2 解压 titan-all-0.3.2.zip 到 /opt/hugedata/share/解压后得到 ...
- 【转】在 XAML 的属性中,转义大括号 {}
我们知道大括号"{}"在XAML中是用来处理标记扩展的. 比如: <Button Content="{Binding}"/> 但如何转义而表示普 ...
- tensorflow省钱方案-ml-engine
google cloud有专门的ml-engine(machine learning engine)模块,可以直接用来跑tensorflow,不用像虚拟机一样开关机.只需要根据需要指定配置就行.收费分 ...
- 防CSRF攻击:一场由重复提交的问题引发的前端后端测试口水战
重复提交,这是一直以来都会存在的问题,当在网站某个接口调用缓慢的时候就会有可能引起表单重复提交的问题,不论form提交,还是ajax提交都会有这样的问题,最近在某社交app上看到这么一幕,这个团队没有 ...
- Atitit 架构的原则attilax总结
Atitit 架构的原则attilax总结 1.1. Rule of three称为"三次原则",指的是当某个功能第三次出现时,才进行"抽象化".是DRY原则和 ...
- 事件,委托,action与func文章不错的
https://www.cnblogs.com/yinqixin/p/5056307.html https://www.cnblogs.com/BLoodMaster/archive/2010/07/ ...
- socket.io笔记二之事件监听回调函数接收一个客户端的回调函数
//服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...
- Capterra Software Categories
https://www.capterra.com/categories this software categories is valuable.