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

CompilerwarningerrorwhencomparingstructwithnullShare

时间:2023-04-11 02:51:09 C#

CompilerwarningerrorwhencomparingstructwithnullPleaseconsiderthefollowingcode:DateTimet=DateTime.Today;boolisGreater=t>null;使用VisualStudio2010(C#4、.NET4.0),我收到以下警告:warningCS0458:Theresultofanexpressionisalways'null'oftype'bool'whichisincorrect;结果始终为false(布尔类型):structDateTime现在重载>(大于)运算符。任何不可为null的结构(例如DateTime)都可以隐式转换为相应的Nullable类型。上面的表达式完全一样boolisGreater=(DateTime?)t>(DateTime?)null;这也会产生相同的错误警告。这里的>运算符是提升的运算符。如果其两个操作数中的任何一个的HasValue为假,则返回假。否则,提升运算符将继续将两个操作数扩展到底层结构,然后调用该结构定义的>的重载(但如果一个操作数不是HasValue,则在这种情况下不需要)。你能重现这个错误吗?这个错误是已知的吗?我误会了什么吗?这对所有结构类型(不是像int这样的简单类型,但不是枚举类型)都是一样的,它会重载运算符。(现在,如果我们使用==而不是>,一切都应该完全相似(因为DateTime也重载了==运算符)。但它并不相似。如果我说DateTimet=DateTime.Today;boolisEqual=t==null;我没有收到警告?有时你会看到人们不小心检查了变量或参数是否为null,没有意识到他们的变量类型是一个结构(它重载了==而不是像int这样的简单类型)。如果他们这样做会更好收到警告。)更新:使用VisualStudio2015的C#6.0编译器(基于Roslyn),上面isGreater的错误消息已更改为CS0464,并带有正确且有用的警告消息。此外,上面缺少的isEqual警告已在VS2015的编译器中修复,但仅在使用/features:strict进行编译时才修复。你是对的:这是VisualStudio中的错误。C#4.0标准(§7.3.7提升运算符)是这样说的:对于关系运算符=[...],如果一个或两个操作数为null,则提升运算符产生值false。...事实上,在MonoDevelop中,您会收到以下警告:将类型System.DateTime与null进行比较总是计算为false。我在Roslyn中实现提升运算符行为时独立发现了这个错误,并在我离开之前在Roslyn中修复了它。抱歉,我在10月份发布时没有看到它。感谢您将此提交给Connect!对这个错误深表歉意;这是运算符语义分析中长期存在的错误。顺便说一句,我将在本月晚些时候(2012年12月)在http://ericlippert.com上讨论Roslyn如何优化提升表达式,所以如果您对这个话题感兴趣,请查看:http://ericlippert.com/ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/DateTimet=DateTime.Today;boolisGreater=(DateTime?)t>(DateTime?)null;在这种情况下,警告Thecontentoft>null。这永远不会是真的。因为无法评价。在这种情况下:boolisGreater=(DateTime?)t>(DateTime?)null;我们正在评估(DateTime?)t>(DateTime?)null;或者基本上在最好的情况下t>null;和以前一样。DateTime.Now永远不会大于Undefined,因此会出现警告。以上是C#学习教程:比较struct和null时,编译器提示errorsharing。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: