小编典典

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

c#

我试图使用扩展方法将操作员重载添加到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此上下文中不允许使用关键字。

通过扩展方法可以添加运算符重载吗?如果是这样,解决该问题的正确方法是什么?


阅读 632

收藏
2020-05-19

共1个答案

小编典典

目前这是不可能的,因为扩展方法必须在静态类中,并且静态类不能有运算符重载。

C#语言PM的Mads Torgersen说:

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

我们越来越意识到其他类型的扩展成员也可能有用,因此我们将在Orcas之后再讨论这个问题。但是,没有任何保证!

编辑:

我刚刚注意到,Mads在同一篇文章中写道:

遗憾的是,我们将在下一个版本中不再这样做。我们确实在计划中非常重视扩展成员,并花了很多努力来使他们正确,但是最终我们无法使其顺畅,因此决定让位给其他有趣的功能。

对于将来的版本,这仍然是我们的注意事项。如果我们能获得大量引人入胜的方案来帮助进行正确的设计,那将会有所帮助。


当前(可能)在C#8.0上具有此功能。Mads
在这里讨论了更多有关实现它的内容。

2020-05-19