让我们看看以下代码:
int a = 1;
int? b = null;
var addition = a + b;
var subtraction = a - b;
我希望addition
和subtraction
都是1
。但实际上两者都是null
。没有语法糖的生成代码是这样的:
int? addition = b.HasValue ? new int?(a + b.GetValueOrDefault()) : new int?();
从VB.NET的角度来看,这更具有违反直觉:1 + Nothing
的结果是Nothing
。
我认为他们可以轻松地以这种方式进行添加:
int addition = a + b.GetValueOrDefault();
//or int? addition = a + b.GetValueOrDefault();
但说实话,目前的设计不会破坏its associativity。我的问题是:为什么他们这样设计运营商?我期望的行为有什么不利之处?
编辑一些评论提到“因为null
不是0
”,这是绝对正确的。但这并不是1+null==null
,我没有说null
是0
的原因。为什么1+null==1
不能?请注意:即使1+null==1
和1+0==1
,我们也无法推断null==0
。如果是,1+null==null
和2+null==null
,我也可以推断1==2
,这没有任何意义。 null
上的操作规则由编译器团队定义,他们为什么选择此规则,将int添加到int和string之间是不同的。
编辑将null
视为“我不知道”,那么您是如何解释将null
添加到字符串“1”而不是原来的“1”而是null
(我不知道)?请注意,null
不是string.Empty
!
编辑我相信此处没有数学问题,因为在某些语言1 + null
会返回1
(尝试使用javascript)。所以它只是语言设计师的一个(也许是个人的)选择。 IMO 1 + null == 1
比当前设计更容易使用。这可能是一个基于意见的主要问题。
答案 0 :(得分:1)
你的逻辑中的缺陷是null
与0
不同。 0
是一个值,而null的定义意味着缺少值。如何将值和缺少值相加?
这样想。我手里拿着一块大理石,另一只手里没有大理石。然后我可以说我有1 + 0
个大理石或一个大理石。
然后说我一只手拿着一块大理石,另一只手拿着一个装有不可知数量弹珠的盒子。我会1 + ?
弹珠。那么我有多少弹珠?
尝试添加值和null
一起试图将算法应用于两个完全不同的概念。没有客观的方法来说明操作会产生什么样的价值,所以最直接的方法就是说没有价值,a.k.a null
。
编辑:在回应关于字符串的观点时,字符串行为不同的原因是因为字符串本身与整数完全不同。 1 + null
毫无意义,但是"1" + null
与将数组与空数组合在一起是一样的,所以你最终得到的是与你开始时相同的数组。
答案 1 :(得分:0)
我认为他们是这样设计的,因为它最有意义。
首先,您需要知道null
与0
不同。 null
表示字面上 NOTHING。那里绝对没有!另一方面,0
是SOMETHING。它有一个值,该值为0
!
我们都知道1 + 0 = 1,但1 +什么都没有?你可以看到这样的操作:
1 +
+
的另一边没有任何东西!并且计算机只能使用一个操作数进行添加!所以它返回null。
答案 2 :(得分:0)
很容易争论和反驳
1 + 0 = 1 +无= 1
但我们的分析是启发式的。我们也在考虑语境意义。对于顺便运行仅在0和1上运行的计算机(二进制即),设计为将0视为具有值的整数。 另一方面,NULL可以用于任何没有价值的东西。所以它在string,int,float,char中使用,但代表变量没有任何值。
没有必要通过添加很少发生的场景来使其复杂化。
现在,在我们的系统中看到添加的方式是添加2个值。 我们没有任何东西或Null的地方没有编码返回和其他值。 但是如果你覆盖+运算符来考虑什么(null)你可以实现你正在寻找的东西。
希望这能解释你的问题。
答案 3 :(得分:0)
如果1 + null == 1
,请考虑以下事项:
int a = 1;
int? b = null;
int result = a + b;
int difference = (a + b) - a;
bool zeroEqualsNull = (difference == b);
result
将是int
,而不是我们所知的int?
int + null == int
显然,difference
可以重新安排为b
。我们然后比较b == b
,其中 应该true
。
但是b
是null
,而不是0
。如果0 == null
我们处于可怕的境地。为什么在这种情况下甚至根本使用int?
?
当然,除非difference
原来是int?
- 这意味着在某些情况下,加法或减法操作必须返回null
。
P.S。指向javascript作为语言应该如何表现的参考是一个坏主意;)