C# - 运算符重载扩展

3

C#是一种多才多艺的语言,它可以让你自由地操作自己和现有的类。你可以重载运算符来使用+*与自定义对象,并且你可以扩展现有对象以添加新的方法。但出于某种原因,C#不允许你将运算符重载作为现有类的扩展。这是为什么呢?是否有解决方法?如果我想为现有类编写运算符重载,那么应该只制作.Plus().Times()扩展方法吗?


要明确的是,_扩展方法_不会向现有对象添加新方法。它们允许对类型的静态方法进行调用,并可选择使用继承自该类型的类的实例通过“点运算符”语法进行调用。这只是“语法糖”。 - Tom Blodget
1个回答

2
三种选择:
  1. 对它们进行子类化,并重载子类
  2. 使用微软公开的相应类别的源代码(或反编译),并编写你自己的重载函数。这在长期内并不可维护,也不一定容易,但它可以工作。
  3. 坚持使用扩展方法。
  4. 使用你的类和“克隆”类之间的转换运算符,如下所述。

在评论中,OP特别提到了使用System.Drawing.PointF。我以前用过的方法是,在像这样的密封类中,使用.NET源代码开发另一个类。我们将这个第二个类称为MyCustomPointF。我可以为我的新类编写运算符。但我还要添加一个被称为隐式转换运算符,帮助编译器在需要时将我的类的实例转换回System.Drawing.PointF实例(而无需调用外部转换函数)。它并不完美,但它是一个选项。


无法反编译它,因为它是一个.NET对象,即PointF,而且还是密封的。换句话说,没有解决办法? - Maurdekye
@Maurdekye 你永远不需要反编译一个.NET对象。.NET公开提供它们的源代码。 - Servy
@Servy 说得好。我会稍微修改一下文本以反映出这一点。 - Xavier J
这并不能帮助我,因为我不能仅仅依赖于在自定义版本的.NET C#上运行我的程序。 - Maurdekye
2
这似乎对于一个简单的便利选项来说有些过度了。我想我还是坚持使用我的扩展方法吧。 - Maurdekye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接