正是(引擎盖下)做了什么+=
和-=
运营商呢?
或者它们是隐含的,因为它们是按类型定义的?
我已广泛使用它们,这是语法的一个非常简单的特性,但我从未想过它的工作原理的深度.
关于这个问题带来了什么
我可以像这样连接一个字符串值:
var myString = "hello ";
myString += "world";
Run Code Online (Sandbox Code Playgroud)
一切都很好.但为什么这不适用于收藏?
var myCol = new List<string>();
myCol += "hi";
Run Code Online (Sandbox Code Playgroud)
你可能会说'你正试图附加一个不同的类型,你不能将一个字符串附加到一个非字符串的类型'.但以下情况也不起作用:
var myCol = new List<string>();
myCol += new List<string>() { "hi" };
Run Code Online (Sandbox Code Playgroud)
好吧,也许它不适用于集合,但以下不是一种(某种)事件处理程序集合?
myButton.Click += myButton_Click;
Run Code Online (Sandbox Code Playgroud)
我显然缺乏对这些运算符如何工作的深入理解.
请注意:myCol
在实际项目中,我不是试图以这种方式构建集合.我只是对这个运营商的运作感到好奇,这是假设的.
Hug*_*une 41
将+=
被隐式这样定义操作:a += b
变成a = a + b;
,同时与-=
运营商.
(警告:正如Jeppe指出的那样,如果a
是一个表达式,它只会被评估一次,如果你使用a+=b
,但两次a=a+b
)
您不能单独重载+=
和-=
运算符.任何支持+
运营商的类型也支持+=
.您可以添加的支持+=
,并-=
以自己的类型由超载+
和-
.
然而,有一个异常硬编码到c#中,您已经发现:
事件有一个+=
和-=
运算符,它将事件处理程序添加到已订阅的事件处理程序列表中.尽管如此,他们并不支持+
和-
运营商.
对于具有常规运算符重载的自己的类,这不是您可以做的事情.
Pik*_*koh 28
正如另一个答案所说,+
运营商没有定义List<>
.您可以检查它是否尝试重载它,编译器会抛出此错误One of the parameters of a binary operator must be the containing type
.
但作为实验,您可以定义自己的类继承List<string>
并定义+
运算符.像这样的东西:
class StringList : List<string>
{
public static StringList operator +(StringList lhs, StringList rhs)
{
lhs.AddRange(rhs.ToArray<string>());
return lhs;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以毫无问题地做到这一点:
StringList listString = new StringList() { "a", "b", "c" };
StringList listString2 = new StringList() { "d", "e", "f" };
listString += listString2;
Run Code Online (Sandbox Code Playgroud)
编辑
根据@EugeneRyabtsev评论,我对+
运算符的实现会导致意外行为.所以它应该是这样的:
public static StringList operator +(StringList lhs, StringList rhs)
{
StringList newList=new StringList();
newList.AddRange(lhs.ToArray<string>());
newList.AddRange(rhs.ToArray<string>());
return newList;
}
Run Code Online (Sandbox Code Playgroud)
Geo*_*org 15
简短的回答是C#中的运算符必须为给定类型重载.这也适用+=
.string
包含此运算符的重载,但List<>
尚未包含.因此,+=
无法使用运算符列表.对于代理,+=
操作员也会过载,这就是您可以+=
在事件处理程序上使用的原因.
稍微长一点的答案是您可以自己使操作员过载.但是,您必须为自己的类型重载它,因此List<T>
无法创建重载,而实际上您可以为自己的类(例如继承)执行此操作List<T>
.
从技术上讲,你并没有真正超载+=
-operator,而是+
操作员.该+=
操作随后被合并推断+
操作与分配.为此,+
操作符应该以结果类型与第一个参数的类型匹配的方式重载,否则C#-compiler将在您尝试使用时抛出错误消息+=
.
归档时间: |
|
查看次数: |
6044 次 |
最近记录: |