扩展的运营商超载是未来的可能性吗?

时间:2018-06-29 20:03:49

标签: c# operator-overloading extension-methods

最近,我获得了约瑟夫和本·阿尔巴哈里(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年内)时提供答案。

1 个答案:

答案 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);
}

首先不支持实例字段的原因在于它们如何跟踪那些字段的状态,我想这很棘手。