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. 手动脱WinUpack 壳实战

    作者:Fly2015 吾爱破解培训第一课选修作业第6个练习演示样例程序.不得不反复那句话,没见过这样的壳,该壳是压缩壳的一种,相对于压缩壳,加密壳的难度要大一些.特别是IAT表的修复问题上. 首先分别 ...

  2. 如何在open xml excel 中存储自定义xml数据?

    如何在open xml excel 中存储自定义xml数据? 而且不能放在隐藏的cell单元格内,也不能放在隐藏的sheet内,要类似web网站的Application变量,但还不能是VBA和宏之类的 ...

  3. Vue(六):条件与循环

    1.条件(v-if) 控制切换一个元素是否显示 <div id="app-3"> <p v-if="seen">现在你看到我了</ ...

  4. 权限管理系统(五):RBAC新解,基于资源的权限管理

    本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的.同时我将讨论一种我认为更好的权限管理方式. 1.什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念.角色是 ...

  5. UI控件篇——UIPageControl及其自定义

    UIPageControl类提供一行点来指示当前显示的是多页面视图的哪一页.当然,由于UIPageControl类可视样式的点击不太好操作,所以最好是确保再添加了可选择的导航选项,以便让页面控件看起来 ...

  6. ios获取文件的MD5值

    一般我们在使用http或者socket上传或者下载文件的时候,经常会在完成之后经行一次MD5值得校验(尤其是在断点续传的时候用的更 多),校验MD5值是为了防止在传输的过程当中丢包或者数据包被篡改,在 ...

  7. 深入理解Linux内核-回收页框

    Linux 系统在为用户态进程和内核分配动态内存的时候,所作的检查是马马虎虎的对内核使用的许多磁盘高速缓存和内存高速缓存大小也同样不作限制. 页框回收算法(PFRA):1.在所有内存使用完之前,就必须 ...

  8. Redis source code analysis

    http://zhangtielei.com/posts/blog-redis-dict.html http://zhangtielei.com/assets/photos_redis/redis_d ...

  9. DCOS :私有云的物理基础架构管理引擎

    https://cloud.tencent.com/developer/article/1005598 一.引言 云计算经过多年的发展,逐渐从概念到渐为人认知.到接受.到现在全行业拥抱上云,云的客户也 ...

  10. .NET MVC+ EF+通用存储过程实现增删改功能以及使用事物处理

    引摘: 1.EF对事务进行了封装:无论何时执行任何涉及Create,Update或Delete的查询,都会默认创建事务.当DbContext类上的SaveChanges()方法被调用时,事务就会提交, ...