C# - 运算符重载扩展
C# - Operator Overload Extensions
C# 是一种多才多艺的语言;它给了你很大的自由来操纵你自己的和现有的 类。您可以重载运算符以将 +
和 *
用于自定义对象,并且您可以扩展现有对象以向它们添加新方法。但出于某种原因,C# 不允许您将运算符重载作为对现有 类 的扩展。为什么是这样?有没有解决方法,或者如果我想为现有 类 编写运算符重载,那么我应该只制作 .Plus()
和 .Times()
扩展方法吗?
三个选项:
- Subclass 它们,并为 subclass
编写重载
- 为相应的 classes 使用 Microsoft 的公开可用源代码(或反编译它们),并编写您的重载。从长远来看,这是不可维护的,或者不一定容易,但它会起作用。
- 坚持使用您的扩展方法。
- class 和 "clone" class 之间的转换运算符,如下所述。
OP在评论中特别提到使用System.Drawing.PointF
。我过去所做的,使用像这样的密封 classes,是使用如上所述的 .NET 源代码开发第二个类似的 class。我们称这秒为 class MyCustomPointF
。我可以为我的新 class 编写运算符。但我还要添加的是所谓的 implicit conversion operator,它可以帮助编译器在我需要时将我的 class 实例转换回 System.Drawing.PointF
实例(无需调用外部转换功能)。它并不完美,但它是一种选择。
C# 是一种多才多艺的语言;它给了你很大的自由来操纵你自己的和现有的 类。您可以重载运算符以将 +
和 *
用于自定义对象,并且您可以扩展现有对象以向它们添加新方法。但出于某种原因,C# 不允许您将运算符重载作为对现有 类 的扩展。为什么是这样?有没有解决方法,或者如果我想为现有 类 编写运算符重载,那么我应该只制作 .Plus()
和 .Times()
扩展方法吗?
三个选项:
- Subclass 它们,并为 subclass 编写重载
- 为相应的 classes 使用 Microsoft 的公开可用源代码(或反编译它们),并编写您的重载。从长远来看,这是不可维护的,或者不一定容易,但它会起作用。
- 坚持使用您的扩展方法。
- class 和 "clone" class 之间的转换运算符,如下所述。
OP在评论中特别提到使用System.Drawing.PointF
。我过去所做的,使用像这样的密封 classes,是使用如上所述的 .NET 源代码开发第二个类似的 class。我们称这秒为 class MyCustomPointF
。我可以为我的新 class 编写运算符。但我还要添加的是所谓的 implicit conversion operator,它可以帮助编译器在我需要时将我的 class 实例转换回 System.Drawing.PointF
实例(无需调用外部转换功能)。它并不完美,但它是一种选择。