数字和可空数之间的加/减的反直觉设计

时间:2016-01-22 04:00:31

标签: c# .net vb.net

让我们看看以下代码:

int a = 1;
int? b = null;
var addition = a + b;
var subtraction = a - b;

我希望additionsubtraction都是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,我没有说null0的原因。为什么1+null==1不能?请注意:即使1+null==11+0==1,我们也无法推断null==0。如果是,1+null==null2+null==null,我也可以推断1==2,这没有任何意义。 null上的操作规则由编译器团队定义,他们为什么选择此规则,将int添加到int和string之间是不同的。

编辑null视为“我不知道”,那么您是如何解释将null添加到字符串“1”而不是原来的“1”而是null(我不知道)?请注意,null不是string.Empty

编辑我相信此处没有数学问题,因为在某些语言1 + null会返回1(尝试使用javascript)。所以它只是语言设计师的一个(也许是个人的)选择。 IMO 1 + null == 1比当前设计更容易使用。这可能是一个基于意见的主要问题。

4 个答案:

答案 0 :(得分:1)

你的逻辑中的缺陷是null0不同。 0是一个值,而null的定义意味着缺少值。如何将值和缺少值相加?

这样想。我手里拿着一块大理石,另一只手里没有大理石。然后我可以说我有1 + 0个大理石或一个大理石。

然后说我一只手拿着一块大理石,另一只手拿着一个装有不可知数量弹珠的盒子。我会1 + ?弹珠。那么我有多少弹珠?

尝试添加值和null一起试图将算法应用于两个完全不同的概念。没有客观的方法来说明操作会产生什么样的价值,所以最直接的方法就是说没有价值,a.k.a null

编辑:在回应关于字符串的观点时,字符串行为不同的原因是因为字符串本身与整数完全不同。 1 + null毫无意义,但是"1" + null与将数组与空数组合在一起是一样的,所以你最终得到的是与你开始时相同的数组。

答案 1 :(得分:0)

我认为他们是这样设计的,因为它最有意义。

首先,您需要知道null0不同。 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

但是bnull,而不是0。如果0 == null我们处于可怕的境地。为什么在这种情况下甚至根本使用int?

当然,除非difference原来是int? - 这意味着在某些情况下,加法或减法操作必须返回null

P.S。指向javascript作为语言应该如何表现的参考是一个坏主意;)