当前位置: 首页 > 编程语言 > C#

运算符“>”不能应用于’ulong’和’int’类型分享

时间:2023-04-10 19:44:27 C#

C#学习教程:Operator">"cannotbeappliedtotypes'ulong'and'int'.枚举权限:ulong{ViewListItems=1L,}publicvoidMethod(){intmask=138612833;int比较=32;if(mask>0&(ulong)Permissions.ViewListItems>32){//Works}if(mask>0&(ulong)Permissions.ViewListItems>compare){//运算符'>'不能应用于'类型的操作数ulong'和'int'}}我一直在试验这个,用ILSpy检查输出,这就是我发现的。显然,在您的第二种情况下,这是一个错误-您无法比较ulong和int,因为没有可以转换为的类型。ulong可能太长,int可能为负数。然而,在第一种情况下,编译器是聪明的。它意识到const1>const32永远不可能为真,并且根本不在编译输出中包含if语句。(它应该警告无法访问的代码。)如果您定义和使用constint而不是文字,或者即使您显式转换文字(即(int)32),也是一样的。但是,编译器是否成功地将我们刚才说的不可能的ulong与int进行了比较呢?很明显不是。那是怎么回事?请尝试按照以下方式做一些事情。(输入和写入输出,所以编译器不编译任何东西。)常量整数三十二=32;staticvoidMain(string[]args){ulongx=ulong.Parse(Console.ReadLine());boolgt=x>三十二;控制台.WriteLine(gt);这将编译,即使ulong是一个变量,即使结果在编译时是未知的。查看ILSpy中的输出:privatestaticvoidMain(string[]args){ulongx=ulong.Parse(Console.ReadLine());boolgt=x>32uL;/*哦,看,一个ulong。*/控制台.WriteLine(gt);因此,编译器实际上将您的constint视为ulong。如果你让3tirtytwo=-1,即使我们知道gt永远为真,代码也不会编译。编译器本身无法将ulong与int进行比较。另请注意,如果将x设为long而不是ulong,编译器会生成32L而不是32作为整数,即使它不需要这样做。(您可以在运行时比较int和long。)这表明编译器在第一种情况下不会将32视为ulong,因为它必须这样做,因为它可以匹配x的类型。它使运行时不必强制常量,这在强制不应该是正确的情况下只是一个好处。给出此错误消息的不是CLR,而是编译器。在第一个示例中,编译器将32视为ulong(或可以隐式转换为ulong的类型,例如uint),而在第二个示例中,您已将类型显式声明为int。接受ulong和int的>运算符没有被重载,所以你会得到一个编译器错误。rich.okelly和rawling的答案是正确的,为什么你不能直接比较它们。您可以使用Convert类的ToUInt64方法提升int。以上是C#学习教程:运算符“>”不能应用于'ulong'和'int'类型共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——if(mask>0&(ulong)Permissions.ViewListItems>Convert.ToUInt64(compare)){}这篇文章是收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: