gpt4 book ai didi

c#-4.0 - C# 移位运算符重载

转载 作者:行者123 更新时间:2023-12-02 09:11:01 29 4
gpt4 key购买 nike

第二个操作数的类型必须是int有什么原因吗?

...
// I would like to do this
public static StringList operator<<(StringList list, string s) {
list.Add(s);
return list;
}
// but only int is supported...
...

编辑:可以肯定的是......我可以重载operator*来获取(例如)字符串列表

class MyString {
string val;
public MyString(string s) {
val = s;
}
public static List<string> operator*(MyString s, int count) {
List<string> list = new List<string>();
while (count-- > 0) {
list.Add(s.val);
}
return list;
}
}

...
foreach (var s in new MyString("value") * 3) {
s.print(); // object extension (Console.WriteLine)
}
// output:
// value
// value
// value
...

但不能重载左移,这是从 C++ std 中众所周知的(输出重载),因为不清楚?当然,这只是 C# 设计者的决定。尽管如此,它仍然可能在某些意外/不清楚的情况下重载(使用 int)。

真的是因为代码写的不清楚吗?

最佳答案

是的。这是因为language specification需要它:

When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration, and the type of the second operand must always be int.

语言设计者不必做出这个决定 - 如果他们愿意的话,他们本来可以取消该限制 - 但我认为规范的这一部分解释了他们的理由对运算符重载的此(和其他)限制:

While it is possible for a user-defined operator to perform any computation it pleases, implementations that produce results other than those that are intuitively expected are strongly discouraged.

他们可能希望位移运算符始终表现得像位移运算符,而不是完全令人惊讶的东西。

关于c#-4.0 - C# 移位运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com