相关疑难解决方法(0)

C#Nullable Equality Operations,为什么null <= null解析为false?

为什么在.NET中呢?

null >= null
Run Code Online (Sandbox Code Playgroud)

解析为假,但是

null == null 
Run Code Online (Sandbox Code Playgroud)

解析为真?

换句话说,为什么不null >= null等同于null > null || null == null

有人有正式答案吗?

.net c# null comparison-operators

39
推荐指数
3
解决办法
2万
查看次数

c#你需要检查某些东西是否有值以及某些东西是否大于0?

在一个项目上工作,编码员在他的支票上做了很多.首先,他检查可空int是否有值,然后检查它是否大于0.为什么?为什么要进行两次检查,如果一次检查 - 如果大于0 - 应该足够吗?因为空值不大于0所以......这是多余的吗?

不确定这是否是我在这里问的问题,但我不知道如何在谷歌搜索中说出来,所以也许我不知道这个程序员做了什么.

c# if-statement

18
推荐指数
1
解决办法
4万
查看次数

将struct与null进行比较时,编译器警告错误

请考虑以下代码:

DateTime t = DateTime.Today;

bool isGreater = t > null;
Run Code Online (Sandbox Code Playgroud)

使用Visual Studio 2010(C#4,.NET 4.0),我收到以下警告:

警告CS0458:表达式的结果始终为'bool'类型的'null'

这是不正确的; 结果总是false(类型bool):

现在,struct DateTime重载>(大于)运算符.任何不可为空的结构(如DateTime)都可以隐式转换为相应的Nullable<>类型.上面的表达式完全相同

bool isGreater = (DateTime?)t > (DateTime?)null;
Run Code Online (Sandbox Code Playgroud)

这也产生了同样的错误警告.在这里,>操作员是提升的操作员.如果HasValue其两个操作数中的任何一个是,则返回false false.否则,提升的运算符将继续将两个操作数展开到底层结构,然后调用该>结构定义的重载(但在这种情况下,这不是必需的,其中一个操作数不是HasValue).

你能重现这个bug,这个bug是众所周知的吗?我误解了什么吗?

对于所讨论int的运算符重载的所有结构类型(不是简单类型,而不是枚举类型),这是相同的.

(现在如果我们使用==而不是>,那么一切都应该完全相似(因为DateTime也会使==运算符超载).但它不相似.如果我说

DateTime t = DateTime.Today;

bool isEqual = t == null;
Run Code Online (Sandbox Code Playgroud)

没有得到警告☹有时候你会看到人们不小心检查变量或参数为null,没有意识到他们的变量类型是一个结构(它过载==而且不是一个简单的类型int).如果他们得到警告会更好.)


更新:使用Visual Studio 2015的C#6.0编译器(基于 Roslyn …

c# comparison nullable compiler-warnings lifted-operators

11
推荐指数
2
解决办法
941
查看次数