我试图使用扩展方法将操作员重载添加到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#语言PM的Mads Torgersen说:
…对于Orcas版本,我们决定采用谨慎的方法,仅添加常规扩展方法,而不是扩展属性,事件,运算符,静态方法等。常规扩展方法是LINQ所需要的,它们具有一种语法上最小的设计,对于其他某些成员来说,这是不容易模仿的。 我们越来越意识到其他类型的扩展成员也可能有用,因此我们将在Orcas之后再讨论这个问题。但是,没有任何保证!
…对于Orcas版本,我们决定采用谨慎的方法,仅添加常规扩展方法,而不是扩展属性,事件,运算符,静态方法等。常规扩展方法是LINQ所需要的,它们具有一种语法上最小的设计,对于其他某些成员来说,这是不容易模仿的。
我们越来越意识到其他类型的扩展成员也可能有用,因此我们将在Orcas之后再讨论这个问题。但是,没有任何保证!
编辑:
我刚刚注意到,Mads在同一篇文章中写道:
遗憾的是,我们将在下一个版本中不再这样做。我们确实在计划中非常重视扩展成员,并花了很多努力来使他们正确,但是最终我们无法使其顺畅,因此决定让位给其他有趣的功能。 对于将来的版本,这仍然是我们的注意事项。如果我们能获得大量引人入胜的方案来帮助进行正确的设计,那将会有所帮助。
遗憾的是,我们将在下一个版本中不再这样做。我们确实在计划中非常重视扩展成员,并花了很多努力来使他们正确,但是最终我们无法使其顺畅,因此决定让位给其他有趣的功能。
对于将来的版本,这仍然是我们的注意事项。如果我们能获得大量引人入胜的方案来帮助进行正确的设计,那将会有所帮助。
当前(可能)在C#8.0上具有此功能。Mads 在这里讨论了更多有关实现它的内容。