Enumerationsusingentrieswithvaluesofsameunderlyingtype如果我声明一个像enumWeekdays这样的enum{Mon=1,Tue=1,Wen=1,Thi,Fri,Sat,Sun}Weekdaysobj=(Weekdays)1;Console.WriteLine(obj);//打印星期二为什么?现在,如果我更改工作日并执行与枚举工作日相同的操作{Mon=1,Tue=1,Wen=1,Thi=1,Fri,Sat,Sun}Weekdaysobj=(Weekdays)1;Console.WriteLine(obj);//打印Thi!!!!!如何?这里到底发生了什么?根据MSDN,如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回的名称做出任何假设。当您像这样写出您的值时,最终将调用ToString()。控制台.WriteLine(obj);如果您深入研究代码,它会根据您的值调用Enum.GetName()。关于具有相同底层值的多个枚举值,MSDN上的Enum.GetName页面说:如果多个枚举成员具有相同的底层值,GetName方法保证返回其中一个枚举成员的名称。但是,它不保证它将始终返回相同的枚举成员名称。因此,当多个枚举成员具有相同的值时,应用程序代码不应依赖返回特定成员名称的方法。它没有说明如果两个或多个的值相同,如何确定返回哪个名称。Enum.ToString()的文档包含相同的警告,但措辞略有不同。再深入一点,上面的方法调用Array.BinarySearch,传递一个代表枚举中所有值的数字数组,以及一个代表要打印的值的数字。因此,您有一个包含多个1的数组,并且您正在搜索1。该调用的文档类似于:允许重复元素。如果Array包含多个等于value的元素,则该方法仅返回一次出现的索引,不一定是第一次出现的索引。同样,它没有说明选择是如何做出的,只是说它不可靠。当您指定相似的值时,结果将是意外的,但我认为它会评估两种情况:当n为偶数时:(n/2)当n为奇数时:(n/2)+1如果我像这样更改枚举:enumWeekdays{Mon=1,Tue=1,Wen=1,Thi=1,Fri=1,Sat=1,Sun=1,Mon2=1,Mon3=1}//n是奇数=9//(n/2)+1=5个工作日obj=(Weekdays)1;控制台.WriteLine(obj);结果将是星期五,现在让我们再次更改枚举:enumWeekdays{Mon=1,Tue=1,Wen=1,Thi=1,Fri=1,Sat=1,Sun=1,Mon2=1}//n是偶数=8//(n/2)=4Weekdaysobj=(Weekdays)1;安慰。写线(对象);结果现在是Thi,再次更改枚举:enumWeekdays{Mon=1,Tue=1,Wen=1,Thi=1,Fri=1,Sat=1,Sun=1}//n是奇数=7//(n/2)+1=4个工作日obj=(Weekdays)1;控制台.WriteLine(obj);结果现在是Thi,再次更改枚举:enumWeekdays{Mon=1,Tue=1,Wen=1,Thi=1,Fri=1,Sat=1}//n是偶数=6//(n/2)=3工作日obj=(Weekdays)1;控制台.WriteLine(obj);结果现在是Wen,再次更改枚举:enumWeekdays{Mon=1,Tue=1,Wen=1,Thi=1,Fri=1}//n是奇数=5//(n/2)+1=3工作日obj=(工作日)1;控制台.WriteLine(obj);现在的结果是,再次更改枚举:enumWeekdays{Mon=1,Tue=1,Wen=1,Thi=1}//niseven=4//(n/2)=2个工作日obj=(Weekdays)1;控制台.WriteLine(obj);结果现在是星期二,再次更改枚举:enumWeekdays{Mon=1,Tue=1,Wen=1}//n是奇数=3//(n/2)+1=2Weekdaysobj=(Weekdays)1;控制台.WriteLine(obj);结果现在是星期二即使这完全解释了行为,它也可能不会总是发生或可能不会发生,因为我没有检查更多的情况,但是当MSDN说你不应该假设枚举有这样的输出时具有不同名称的相同值......也就是说,我认为你现在很容易看出代码中发生了什么参考:链接编辑:@GrantWinney的回答让我想到了这个,他写道,Array.BinarySearch被传递了一个数组的值和要搜索的值,所以从名称Array.BinarySearch我意识到这肯定是使用BinarySearch并解释了一切......二分搜索将这样划分数组:Mid={Low(这是起始索引)+High(这是数组的最后一个索引)}/2然后检查(Mid==value)是否返回索引;否则,如果值小于或等于,则向左移动,否则向右移动数组因此,这解释了如果枚举值是您尝试打印的值的多个名称,则如何打印它们。你原来的问题enumWeekdays{Mon=1,Tue=1,Wen=1,Thi,Fri,Sat,Sun}Weekdaysobj=(Weekdays)1;控制台.WriteLine(obj);//打印星期二为什么?它打印Tue是因为将调用Array.BinarySearch传递数组{1,1,1,2,3,4,5}和值为1的搜索...所以BinarySearch将执行:Mid={Low(0)+High(6)}/2if(Mid==value)returnindexelsemoveleft再次左移后,会计算Mid:High=Mid-1;//现在只搜索左边的子数组Mid={Low(0)+High(2)}/2if(Mid==value)returnindex//这里条件为真,你将返回`Tue`您问题中的第二个示例:enumWeekdays{Mon=1,Tue=1,Wen=1,Thi=1,Fri,Sat,Sun}Weekdaysobj=(Weekdays)1;Console.WriteLine(obj);//打印Thi!!!!!如何?正如我在上面写的那样,将调用Array.BinarySearch并将数组:{1,1,1,1,2,3,4}传递给值=1的搜索...在上应用BinarySearch算法数组,它将评估为Thi。以上就是C#学习教程:使用底层类型值相同的条目枚举,分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表侵权,请点击右边联系管理员删除。如需转载请注明出处:
