【发布时间】:2017-03-23 01:25:04
【问题描述】:
+= 和 -= 操作符到底是做什么的?
或者它们是隐含的,它们是按类型定义的?
我已经广泛使用它们,这是语法的一个非常简单的功能,但我从未想过它的工作原理。
问题带来了什么
我可以像这样连接一个字符串值:
var myString = "hello ";
myString += "world";
一切都好。但是为什么这不适用于集合呢?
var myCol = new List<string>();
myCol += "hi";
你可能会说'好吧,你正试图附加一个不同的类型,你不能将一个字符串附加到一个不是字符串的类型'。但以下也不起作用:
var myCol = new List<string>();
myCol += new List<string>() { "hi" };
好的,也许它不适用于集合,但以下不是事件处理程序的(某种)集合吗?
myButton.Click += myButton_Click;
我显然对这些运算符的工作原理缺乏深入的了解。
请注意:我并不想在实际项目中以这种方式构建集合myCol。我只是对这个运算符的工作原理感到好奇,这是假设性的。
【问题讨论】:
-
值得注意的是,“什么是加法”实际上是数学中一个相当棘手的小概念。尽管这个概念对许多人来说是直观的,但它需要大量精心构建的工作来定义它。类似的推论出现在计算机语言设计中。虽然定义
+=的功能很容易,但深入了解 为什么 我们将其编写为以这种方式工作需要更多时间。 -
我的意思是,真的,
"10" + "20"-"1020"会发生什么?还是"30"?谁来告诉别人回答这个问题的方法是对还是错? -
这里的根本问题是
+被用来表示正常的数字加法、字符串连接和多播委托的排序,所有这三个操作都只是彼此相切的。这有点滥用我们对加法的直觉,这会导致混乱。最好的办法是将+和+=视为由于历史原因具有相同语法的几个不同事物。 -
@corsiKa
"10" + "20"是"1020",因为它们是字符串。10 + 20是30,因为它们是数字。这不是很明显(在静态类型语言中)吗?