C#字符串运算符重载

G’Day Mates –

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

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

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

}

String是一个密封的类。 你不能inheritance它,如果没有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 

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

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

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

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

  • 您不能为字符串设置部分类,因为字符串类本身不是部分的 ,因此不适用于您的部分类。

  • 字符串是密封的,因此您可以inheritance它,然后重载操作符。

简而言之,唉,你不能做你要做的事情。

不知道你究竟要做什么,我不能建议一个好的选择。 但是,看看扩展方法 ,它们通常适用于各种情况。 暂且不管你是否应该 :),你可以在字符串类中添加一个名为IsGreaterThan的方法,并根据需要返回true或false。 这很好,因为你可以给扩展方法一个名称,使其意义清晰,保持现有的操作符(无论如何你都没有选择),并允许快速/简单的代码。

您不能直接重载> =和<=运算符,但可以通过分别重载>和==来实现相同的结果。

您的代码似乎对我来说是正确的,除了您错过了==的重载。

似乎我错了,但是,你总是可以回到反思。 我认为如果你做一些挖掘和黑客攻击,你可以使用reflection来扩展类,因为reflection允许在运行时添加函数或交换函数体。

无论是可取的还是良好的做法,我都怀疑它。 课程密封的原因是有道理的。 由于.net框架对字符串做出的一些假设,执行我提到的事情可能会在某些情况下导致未定义的行为。 字符串类将在内部崩溃的可能性很大。