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之间的恩怨的更多相关文章

  1. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  2. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  3. 【C#基础概念】枚举 (enum详解)

    我们重点来讲解 简单枚举和标志枚举的用法和区别 继承 Object-> ValueType ->Enum Object-> ValueType ->struct 包括int f ...

  4. 又爱又恨系列之枚举enum

    其实枚举挺简单的,只不过以前没好好学,所以不知道这个东西,恩,现在梳理一下 整体而言,首先枚举是一个数据类型,这个数据类型和结构体有点像 可以分为三个层次 1.枚举数据类型定义 第一种:enum 枚举 ...

  5. [未完成]关于枚举(Enum)

    今天总结一下枚举相关的知识.先附一段关于枚举的代码: package org.talend.core.model.param; import org.talend.core.i18n.Messages ...

  6. 【 枚举 Enum 】循环 名称与值

      foreach (WeekDay c in (WeekDay [])Enum.GetValues(typeof(WeekDay ))) {Console.Write(String.Format(& ...

  7. 枚举enum学习小记

    参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社 ...

  8. JAVA—枚举(Enum)学习总结

    1.枚举(Enumeration) 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式.这种传统接口已被迭代器取代,虽然Enumeration 还未被遗弃,但在现代代码 ...

  9. java枚举(enum)

    1. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum (抽象类) 类的子类. enum AccountType { SAVING, FIXED, CURRE ...

随机推荐

  1. 7.翻译:EF基础系列---EF中的实体类型

    原文地址:http://www.entityframeworktutorial.net/Types-of-Entities.aspx 在Entity Framework中有两种实体类型:一种是POCO ...

  2. 【转载并整理】AJAX XmlHttpRequest对象详解

    一. XMLHttpRequest由来及原生介绍 XMLHttpRequest(XHR)是一个API对象,其中的方法可以用来在浏览器和服务器端传输数据.这个对象是浏览器的js环境提供的.从XHR获取数 ...

  3. Android自带的TTS功能

    在Android1.6之后添加了TextToSpeech,也叫TTS,把相应的文字转化成语音播报,增强了用户体验.可以根据语言播报 界面上的控件如下: 可以选择的语言 但有的语言不支持,比如中文就不支 ...

  4. php分享十八七:mysql基础

    mysql操作数据库代码: $link = @mysql_connect('localhost:3306', 'root', 'root') or die(mysql_error()); mysql_ ...

  5. linux分享二:Linux如何修改字符集

    问题: 当在项目中用到服务器端导出并且查询条件中包含汉字时,总是导出失败,Excel中出现null字样,如何解决方法呢? 解决方法: 把linux的字符集改变一下. 路径:etc/sysconfig/ ...

  6. Android网络功能之会话发起协议SIP

    原文:http://android.eoe.cn/topic/android_sdk * 会话发起协议* Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话 ...

  7. 腾讯云服务器 - 定时备份MariaDB/MySQL

    数据库数据备份尤为重要,而我们不会人工手动去备份,这样会很麻烦,我们都是通过服务器每日自定运行来做的,设置一个定时时间即可 首先我们看一下mysqldump这个文件的位置: 可以看到目录在 /usr/ ...

  8. 牛腩学ASP.NET CORE做博客(视频)

    牛腩学习ASP.NET CORE做的项目,边学边做. 目录: 01-dotnetcore网站部署到centos7系统上(时长 2:03:16) 02-前期准备及项目搭建 (时长:0:23:35) 03 ...

  9. [svc]Linux中Swap与Memory内存简单介绍

    swap区域是干嘛的 cpu 内存(不常用到的进程swap区) 磁盘 当内存没有可用的,就必须要把内存中不经常运行的程序给踢出去.但是踢到哪里去,这时候swap就出现了. 背景介绍 对于Linux来说 ...

  10. hdu Constructing Roads (最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102 /************************************************* ...