【问题标题】:Is Extended Operator Overloading A Future Possibility?扩展运算符重载是未来的可能性吗?
【发布时间】:2018-06-29 20:03:48
【问题描述】:

我最近得到了 Joseph 和 Ben Albahari 的 C# 7.0 in a Nutshell 副本。当我浏览有关高级 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 年内)时提供答案。

【问题讨论】:

  • 在一个例子中你会如何称呼那个操作符?无论如何:为什么在这里问这个而不是微软支持?我们怎么知道微软对此有什么计划?
  • 语言存储库有许多与此相关的问题以及属于“扩展一切”标题下的类似功能(例如扩展属性)。最近的问题之一是here

标签: c# operator-overloading extension-methods


【解决方案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);
}

最初不支持实例字段的原因是他们必须如何跟踪这些字段的状态,我想这很棘手。

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 2021-11-02
    • 2014-10-27
    • 1970-01-01
    • 2020-04-13
    • 2021-10-10
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多