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. WinForm DataGridView新增加行

      1.不显示最下面的新行 通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * ).如果不想让用户新追加行即不想显示该新行,可以将 DataGridView 对象的 Allow ...

  2. spring 下载

    Spring官网(https://spring.io/)改版后,直接下载Jar包的链接,下面汇总 1.直接输入地址,改相应版本即可:http://repo.springsource.org/libs- ...

  3. mysql中查询一个字段属于哪一个数据库中的哪一个表的方式

    mysql中查询一个字段具体是属于哪一个数据库的那一张表:用这条语句就能查询出来,其中 table_schema 是所在库, table_name 是所在表 --mysql中查询某一个字段名属于哪一个 ...

  4. logstash 如何处理 mongodb 导出来的 _id value数据。 how to custom fields of logstash by mongo mapreduce exported data.(example format: {_id:"xxx"} , value:{})

    input { file { path => "c:\aa.json" start_position => "beginning" #sincedb ...

  5. JS中getElementByID,getElementsByName,getElementsByTagName的区别

    <input type="text" name="mynumber" id="mynum1" value="" / ...

  6. SpringBoot不使用模板引擎直接返回html

    一.在resource目录下面建立文件夹,里面方静态页面. 路径:src\main\resources\static\page\index.html 访问:http://localhost:8080/ ...

  7. DDR3控制

    很简单的,app_en和app_rdy一握手,代表MIG接受了一个写数据请求或者读数据请求,只要保证app_en和app_rdy握手,根本就不关心写数据rdy,这是MIG的一个bug,你看它源码就知道 ...

  8. [na]完全理解icmp协议

    1.ICMP出现的原因 在IP通信中,经常有数据包到达不了对方的情况.原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了.或者,虽然到达了对方,但是由于搞错了端口号 ...

  9. 读取JPG图片的Exif属性(一) - Exif信息简介

    https://blog.csdn.net/fioletfly/article/details/53605959 https://blog.csdn.net/a_big_pig/article/det ...

  10. FFmpeg(3)-AVFormatContext 结构体内容分析

    AVIOContext *pb                          IO Context,.自定义一些读写格式或者从内存当中读时用到此成员变量. char filename[1024]; ...