小编典典

使用 C# 扩展方法的运算符重载

all

我正在尝试使用扩展方法向 C#StringBuilder类添加运算符重载。具体来说,给定StringBuilder sb,我想sb += "text"等效于sb.Append("text")

下面是创建扩展方法的语法StringBuilder

public static class sbExtensions
{
    public static StringBuilder blah(this StringBuilder sb)
    {
        return sb;
    }
}

它成功地将blah扩展方法添加到StringBuilder.

不幸的是,运算符重载似乎不起作用:

public static class sbExtensions
{
    public static StringBuilder operator +(this StringBuilder sb, string s)
    {
        return sb.Append(s);
    }
}

除其他问题外,this此上下文中不允许使用关键字。

是否可以通过扩展方法添加运算符重载?如果是这样,正确的方法是什么?


阅读 72

收藏
2022-07-29

共1个答案

小编典典

目前这是不可能的,因为扩展方法必须在静态类中,而静态类不能有运算符重载。但该功能正在讨论 C# 的 某些
未来版本
Mads在 2017
年的这段视频中
谈到了更多关于实现它的内容。

C# 语言 PM 的 Mads Torgersen 说:

…对于 Orcas 版本,我们决定采取谨慎的方法,只添加常规扩展方法,而不是扩展属性、事件、运算符、静态方法等。常规扩展方法是 LINQ
所需要的,它们有一种语法上最小的设计,对于其他一些成员类型来说是不容易模仿的。

我们越来越意识到其他类型的扩展成员可能有用,因此我们将在 Orcas 之后回到这个问题。不过没有保证!

下面在同一篇文章中:

我很遗憾地报告我们不会在下一个版本中这样做。我们确实在我们的计划中非常重视扩展成员,并且花了很多精力试图让他们正确,但最终我们无法做到足够顺利,并决定让位于其他有趣的功能。

这仍然是我们对未来版本的关注。如果我们获得大量可以帮助推动正确设计的引人入胜的场景,将会有所帮助。

2022-07-29