覆盖字符串的方括号运算符?

Override the square bracket operator of string?

我尝试更改方括号运算符的行为。 现在我的问题是是否有可能做到这一点。

我知道我可以为 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[...] 属性.

你的问题:"how can I override the square bracket operator?" 有这样的答案:简而言之,你像任何其他人一样覆盖 属性,提供 你可以:

  1. 从声明它的类型继承
  2. 覆盖它,因为它是虚拟的
  3. 实际上得到了效果,因为您可以让代码在构造对象时使用新的后代类型而不是原始基类型

对于字符串,条件都是不行的:

  1. 不能继承strings,是密封类型,出于性能考虑多包含外部代码
  2. 既然类型是密封的,那么虚拟成员就没有意义了
  3. 在大量代码中构造字符串时,您不能替代 System.String 类型的使用。

所以覆盖这个字符串?不行,做不到。

然后你展示一个你想出的例子,它类似于扩展方法的语法

在继续之前回顾一下:

  • 为了override一些东西,我们讲讲继承和多态(virtual member in base class)
  • 要使用扩展方法扩展某些东西,您可以在不修改所述类型的情况下为现有类型提供额外的方法

是的,您当然可以向字符串添加扩展方法,但您不能提供扩展属性(目前)

新的 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);