c# – 枚举[]是IEnumerable在通用方法中返回true

栏目: C# · 发布时间: 6年前

内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/20292988/enum-is-ienumerableint-returns-true-in-a-generic-method
这是对这个问题的跟进: Cast<int>.Cast<int?> applied on generic enum collection results in invalid cast exception
enum Gender { Male, Female }

Gender g = Gender.Male;

bool b = g is int; // false, alright no issues
b = new[] { g } is IEnumerable<int>; // false, alright no issues
b = Is<Gender, int>(g); //false, alright no issues
b = Is<Gender[], IEnumerable<int>>(new[] { g }); // true, why on earth !!!

static bool Is<S, T>(S s)
{
    return s is T;
}

为什么Gender []是IEnumerable<int>在通用情况下返回true?特别是当它们不兼容?

IEnumerable<int> c = new[] { Gender.Male }; //not compilable

在我链接的问题中,我已经绊倒了我!我认为这个问题是相关问题的关键.

对于有兴趣的人来说,这是数组的一个角落(不是真的枚举).关注 Eric Lippert’s blog 文章在答案中了解更多这种边缘案例.列表<T>不会发生这种情况例如:

b = Is<List<Gender>, IEnumerable<int>>(new List<Gender> { g }); // false, rightly
我认为这是C#定义与CLI的isinst定义不同的情况之一,当检查数组赋值兼容性时,它明确地将枚举作为基础类型. (Eric Lippert写了一篇 blog post

,解释了为什么uint []被CLI处理为int []而不是C#;我怀疑这里也是同样的解释).你甚至不需要泛型来证明:

Gender g = Gender.Male;
Console.WriteLine(new[] { g } is IEnumerable<int>); // False
Console.WriteLine((object)new[] { g } is IEnumerable<int>); // True

第一个是在编译时将表达式优化为false,因为C#编译器“知道”Gender []不是IEnumerable<int>.第二个是表达式生成在运行时评估的isinst指令.引用Eric Lippert:

It is unfortunate that C# and the CLI specifications disagree on this minor point but we are willing to live with the inconsistency.

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/20292988/enum-is-ienumerableint-returns-true-in-a-generic-method


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

引爆社群:移动互联网时代的新4C法则(第2版)

引爆社群:移动互联网时代的新4C法则(第2版)

唐兴通 / 机械工业出版社 / 69.00元

社群已经被公认为是这个时代的商业新形态,原有的商业逻辑和方法被颠覆,新的基于社群的商业体系和规则亟待构建,今天几乎所有的企业都在为此而努力,都在摸索中前行。 本书提出的“新4C法则”为社群时代的商业践行提供了一套科学的、有效的、闭环的方法论,第1版上市后获得了大量企业和读者的追捧,“新4C法则”在各行各业被大量解读和应用,积累了越来越多的成功案例,被公认为是社群时代通用的方法论。也因此,第1......一起来看看 《引爆社群:移动互联网时代的新4C法则(第2版)》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具