我正在尝试使用扩展方法向 C#StringBuilder类添加运算符重载。具体来说,给定StringBuilder sb,我想sb += "text"等效于sb.Append("text")。
StringBuilder
sb
sb += "text"
sb.Append("text")
下面是创建扩展方法的语法StringBuilder:
public static class sbExtensions { public static StringBuilder blah(this StringBuilder sb) { return sb; } }
它成功地将blah扩展方法添加到StringBuilder.
blah
不幸的是,运算符重载似乎不起作用:
public static class sbExtensions { public static StringBuilder operator +(this StringBuilder sb, string s) { return sb.Append(s); } }
除其他问题外,this此上下文中不允许使用关键字。
this
是否可以通过扩展方法添加运算符重载?如果是这样,正确的方法是什么?
目前这是不可能的,因为扩展方法必须在静态类中,而静态类不能有运算符重载。但该功能正在讨论 C# 的 某些 未来版本。Mads在 2017 年的这段视频中谈到了更多关于实现它的内容。
C# 语言 PM 的 Mads Torgersen 说:
…对于 Orcas 版本,我们决定采取谨慎的方法,只添加常规扩展方法,而不是扩展属性、事件、运算符、静态方法等。常规扩展方法是 LINQ 所需要的,它们有一种语法上最小的设计,对于其他一些成员类型来说是不容易模仿的。 我们越来越意识到其他类型的扩展成员可能有用,因此我们将在 Orcas 之后回到这个问题。不过没有保证!
…对于 Orcas 版本,我们决定采取谨慎的方法,只添加常规扩展方法,而不是扩展属性、事件、运算符、静态方法等。常规扩展方法是 LINQ 所需要的,它们有一种语法上最小的设计,对于其他一些成员类型来说是不容易模仿的。
我们越来越意识到其他类型的扩展成员可能有用,因此我们将在 Orcas 之后回到这个问题。不过没有保证!
下面在同一篇文章中:
我很遗憾地报告我们不会在下一个版本中这样做。我们确实在我们的计划中非常重视扩展成员,并且花了很多精力试图让他们正确,但最终我们无法做到足够顺利,并决定让位于其他有趣的功能。 这仍然是我们对未来版本的关注。如果我们获得大量可以帮助推动正确设计的引人入胜的场景,将会有所帮助。
我很遗憾地报告我们不会在下一个版本中这样做。我们确实在我们的计划中非常重视扩展成员,并且花了很多精力试图让他们正确,但最终我们无法做到足够顺利,并决定让位于其他有趣的功能。
这仍然是我们对未来版本的关注。如果我们获得大量可以帮助推动正确设计的引人入胜的场景,将会有所帮助。