C#移位运算符过载

Mar*_*lík 3 operators c#-4.0

有没有理由第二个操作数的类型必须是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...
...
Run Code Online (Sandbox Code Playgroud)

编辑:只是肯定...我可以重载operator*for get(例如)字符串列表

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
...
Run Code Online (Sandbox Code Playgroud)

但是不能超载左移,从C++ std(输出重载)众所周知,因为它不清楚?当然,这只是C#设计师的决定.仍然可以在意外/不清楚的事情上重载(使用int).

真的原因是它的代码不清楚了吗?

Mar*_*ers 7

是.这是因为语言规范要求:

声明重载的移位运算符时,第一个操作数的类型必须始终是包含运算符声明的类或结构,第二个操作数的类型必须始终为int.

语言的设计者并没有必须要做出这样的决定-这本来是可能为他们去除这个限制,如果想-但我想说明,这部分解释了他们对运算符重载这个(或其他)限制的理由是:

虽然用户定义的操作员可以执行任何令人满意的计算,但强烈建议不要使用直观预期产生结果的实现.

他们可能希望bitshift运算符总是像bitshift运算符一样,而不是完全令人惊讶的东西.

  • 我认为C++错了,C#做对了.任意运算符重载导致代码可读性降低. (3认同)