我尝试更改方括号运算符的行为.
现在我的问题是,是否有可能这样做.
我知道我可以用这样的东西为String创建一个扩展方法:
public static class StringExtension
{
public static char Substring(this string value, int position)
{
//do something
}
}
但是如何覆盖方括号运算符?
这不起作用:
public static class StringExtension
{
public static char this[this string value, int position]
{
//do something
}
}
怎么做到呢.或者甚至可能吗?
最佳答案 让我们一次处理一个概念.
The square bracket operators用于索引到聚合对象:
>阵列
>对象的索引器属性
此外,它们用于表示属性,但这与此答案无关.
现在,字符串不是数组,因此字符串对象具有this […]属性.
您的问题:“如何覆盖方括号运算符?”有这个答案:简单地说,你可以像任何其他财产一样覆盖,只要你可以:
>从声明它的类型继承
>覆盖它,因为它是虚拟的
>实际上是因为在构造对象而不是原始基类型时可以让代码使用新的后代类型
对于字符串,标准都是禁止的:
>您不能从字符串继承,它是密封类型,并且主要包含用于性能考虑的外部代码
>由于类型是密封的,因此虚拟成员没有意义
>在大型代码中构造字符串时,不能替换System.String类型的使用.
那么为字符串覆盖这个?不,不能做.
然后你展示了你想出的一个例子,它类似于扩展方法的语法.
在继续之前回顾:
>要覆盖某些内容,我们讨论继承和多态(基类中的虚拟成员)
>要使用扩展方法扩展某些内容,您可以为现有类型提供现有的额外方法,而无需修改所述类型
是的,你肯定可以在字符串中添加扩展方法,但是你还不能提供扩展属性.
新的Roslyn编译器项目有很多为它建议的功能,包括Extension Everything功能,可以解决这个问题.但是,它尚未决定,也没有计划或实施.
您可以创建一个普通的扩展方法,您无法重新定义,覆盖或扩展[…]运算符的功能.
public static class StringExtension
{
public static char CharAt(this string value, int position)
{
//do something
}
}
用法:
string s = "Test";
char c = s.CharAt(2);