C#字符串运算符重载

Sco*_*ker 9 c# operator-overloading

G'Day Mates -

重载字符串运算符<,>,<=和> =的正确方法(不包括是否可取的参数)是什么?

我已经尝试了五种方式到星期天,我得到了各种错误 - 我最好的镜头是宣布一个部分类并从那里超载,但它不会因某些原因而起作用.

namespace System
{
   public partial class String
   {
       public static Boolean operator <(String a, String b)
       {
           return a.CompareTo(b) < 0;
       }

       public static Boolean operator >(String a, String b)
       {
           return a.CompareTo(b) > 0;
       }
   }
Run Code Online (Sandbox Code Playgroud)

}

Ran*_*pho 18

String是一个密封的类.你不能继承它,如果没有String的原始源,你就无法编译它的部分类.即使您已经掌握了源(可以通过Reflector或通过Visual Studio符号下载),您仍然会遇到问题,因为它是运行时的一等公民.

你真的需要<和>作为字符串的运算符吗?如果是这样......为什么不使用扩展方法呢?

public static bool IsLessThan(this string a, string b) 
{ 
    return a.CompareTo(b) < 0; 
} 

public static bool IsGreaterThan(this string a, string b) 
{ 
    return a.CompareTo(b) > 0; 
}


// elsewhere...
foo.IsLessThan(bar); // equivalent to foo < bar
Run Code Online (Sandbox Code Playgroud)

  • 即使他可以继承它,只有那些继承类型为**且被引用为继承类型**的实例才能使用备用运算符.因为运算符不是多态的(它们被重载,没有被覆盖),即使将子类型引用为"字符串"也会消除备用运算符功能. (4认同)
  • 我知道您的帖子与扩展方法无关,但提供链接可能很有用。对于刚接触 C# 的人来说,它似乎被称为错误。http://msdn.microsoft.com/en-ca/library/vstudio/bb383977.aspx (2认同)

Eri*_*ert 16

无法用您自己的内容替换编译器的任何内置行为.您无法覆盖现有的内置运算符以进行比较,转换,算术等.这是设计的; 它是这样的,有人可以读取你的代码,并知道这int x = M(); int y = x + 2;是整数运算,而不是格式化你的硬盘.

你能解释一下你为什么要这样做吗?也许有更好的方法来做你想要的.


Ada*_*son 10

简单的答案是你做不到; 没有办法修改另一个类的运算符.部分类仅允许在所有文件中声明partial在同一程序集中定义的类.


Dan*_*ker 5

你是说这个System.String班吗?这在C#中是不可能的.您无法将扩展运算符添加到现有类.这是一个非常需要的功能.