对于我自己实现的Equals()方法,我想检查一堆内部字段.我是这样做的:
...
_myNullableInt == obj._myNullableInt &&
_myString == obj._myString &&
...
Run Code Online (Sandbox Code Playgroud)
我假设,这比较值,包括null,对于相等而不是对象地址(作为参考euqality比较操作),因为:
对于此MSDN文档中的 "预定义值类型" ,可以这样说.我假设Nullable<int>是这样一个"预定义的值类型",因为System根据这个MSDN文档,它在命名空间中.
我是否正确地假设VALUES在这里进行比较?
注意:单元测试显示"是",但我希望其他人对这个问题感到放心,以防我错过了什么.
我很想知道Nullable类型如何在幕后工作.它是否正在创建一个新对象(对象可以赋值为null),其值可能为null?
在我们使用Nullable <int>的例子中,当你为它赋值空值时,它们是从对象到int的某种隐式转换,反之亦然?
另外我知道如何手动创建它,使用Nullable类型是否有好处,而不是自己创建它?
我一直认为.NET框架的可空类型只是框架给我们的一个很好的构造,但并没有添加到语言本身的任何新东西.
也就是说,直到今天,为了演示,我尝试创建自己的Nullable结构.
我得到了我需要的一切,除了这样做的能力:
var myInt = new Nullable<int>(1);
myInt = 1;
Run Code Online (Sandbox Code Playgroud)
问题是第二个语句,因为我不能以任何方式重载赋值运算符.
我的问题是:这是一个特殊情况,在赋值运算符有过载的语言中?如果没有,你会如何使之前的例子有效?
谢谢!
null在否定 .c#的值的情况下,我对 c# 编译器感到困惑bool?。编译器确实将其解释!null为null. 我的期望是提高
CS0266(无法将类型“bool?”隐式转换为“bool”)
示例代码:
bool? nullableVal = null;
//if (nullableVal) //OK: CS0266 bool? can't be converted to bool
// ;
var expectCS0266 = !nullableVal;//No compiler error/warning
//if ((!null) ?? false)//OK: CS8310 Operator '!' cannot be applied to operands of type "<NULL>"
// ;
if (! nullableVal ?? false)
;//this statement isn't reached, because of precedence of ! is higher than ??
//and !null == null
if (!(nullableVal ?? false))
;//this …Run Code Online (Sandbox Code Playgroud)