最近,我获得了约瑟夫和本·阿尔巴哈里(Joseph)和本·阿尔巴哈里(Ben Albahari)撰写的C#7.0发行版。当我浏览有关高级C#的页面199时,尤其是在其中开始介绍操作员重载的地方。我开始怀疑,是否有关于运算符重载的正式词,至少类似于基本类型的扩展方法?例如:
// Traditional Overload
public static MyType operator +(MyType, MyType);
// Traditional Extension Method
public static int Sum(this int, int[]);
// Possible Combination?
public static int operator +(this int, int, string);
在上面的示例中,传统的加法运算符重载;这使我可以对我的类型的属性进行自定义添加,以提供新的值。然后是传统的扩展方法,其中我们可以通过添加我们认为有用的方法来扩展类型。与上面的示例类似,如果我经常对整数数组中的所有值进行加法以获得其和,那么我可以创建一个有用的扩展方法来实现:
int sum = int.Sum(myArrayOfIntegers);
综上所述,扩展操作符重载可能很有用,至少对于基元而言。例如:
public static int operator +(this int i, int x, string y) {
// Perform parsing of the string and return the newly added value between x and y.
}
然后,我可以在有用的多个原始类型上执行算术运算,而不必不断尝试解析代码中的数据。解析数据并不是很困难,但是当您必须做数百次相同的事情(包括调用方法来执行解析和算术)时,如果有的话,它会变得很乏味。
自this post以来,我已经进行了一些搜索,但找不到任何与此主题相关的信息,该问题在2008年得到了回答。十年是很长的时间,我希望那篇文章的观点从那时起有所改变
很遗憾地报告,在下一版本中我们将不这样做。我们确实在计划中非常重视扩展成员,并花了很多努力来使它们正确,但最终我们无法使其顺畅,因此决定让位于其他有趣的功能。
对于将来的版本,这仍然是我们的注意事项。如果我们能获得大量引人入胜的方案来帮助进行正确的设计,那将会有所帮助。
在我看来,仍然处于雷达之下并不是很有希望。
请仅在资源可靠且最新(或之前2年内)时提供答案。
答案 0 :(得分:1)
是的。在C#8中,可能会出现“扩展所有内容”,如Github上的here所述。
语法可能是这样的:
public extension class List2DExt<T> : List<List<T>>
{
// Extension static field
private static int _flattenCount = 0;
// Extension static property
public static int FlattenCount => _flattenCount;
// Extension static method
public static int Get FlattenCount() => _flattenCount;
// New syntax for extension methods
public List<T> Flatten() { ... }
// Extension indexers
public List<List<T>> this[int[] indices] => ...;
// Extension implicit operator
public static implicit operator List<T>(List<List<T>> self) => self.Flatten();
// Extension operator overload
public static implicit List<List<T>> operator +(List<List<T>> left, List<List<T>> right) => left.Concat(right);
}
首先不支持实例字段的原因在于它们如何跟踪那些字段的状态,我想这很棘手。