重写字符串的方括号操作符?

4

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

我知道我可以使用类似以下代码创建一个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
    }
}

如何完成这项任务?或者说这是否可能实现?


不,这是不可能的。您不能在静态类中声明索引器,而索引器也不能是静态的。 - Shreevardhan
有一个名为“Extension Everything”的提案 - https://github.com/dotnet/roslyn/issues/11159。然而,目前还不可能为索引器编写扩展方法。 - Evk
1
你想要实现什么?在C#中并不存在“方括号运算符”,它只是一个(保留的)符号,就像圆括号和花括号一样。根据你的例子和其他评论:对字符串进行索引已经是可能的:var c = "hello world"[0];会返回类型为char的'h'。 - Jürgen Röhr
1个回答

2
让我们逐个处理一些概念。
"方括号运算符"用于索引聚合对象:
- 数组 - 对象上的索引器属性
此外,它们也用于表示属性,但这与本回答无关。
现在,一个字符串不是数组,因此字符串对象具有this[...]属性。
您的问题:“如何覆盖方括号运算符?”的答案是:简单地说,您可以像覆盖任何其他属性一样进行覆盖,前提是:
- 继承声明它的类型 - 覆盖它,因为它是虚拟的 - 可以使代码在构造对象时使用您的新派生类型而不是原始基类类型,从而实际获得效果
对于字符串来说,这些标准都不满足。
  • 你不能从字符串继承,它是一个密封类型,大多数包含外部代码以考虑性能问题。
  • 由于该类型是密封的,因此没有设置虚拟成员的必要。
  • 在构建大量代码的字符串时,您无法替换使用System.String类型。

那么为字符串 override 怎么样?不行,无法完成。

然后你展示了一个例子,这个例子类似于 扩展方法 的语法。

在继续之前,让我们回顾一下:

  • override 某些东西,我们需要讨论继承和多态(基类中的虚拟成员)
  • 通过扩展方法 扩展 某些东西,可以为现有类型提供额外的旁边方法,而不修改这些类型

是的,您肯定可以向字符串添加扩展方法,但是您无法提供 扩展属性 (尚未)

新的Roslyn编译器项目有很多建议的功能,包括一个可能解决这个问题的扩展Everything功能。然而,它尚未决定、计划或实现。
您可以创建一个普通的扩展方法,但无法重新定义、覆盖或扩展[...]运算符的操作。
public static class StringExtension
{
    public static char CharAt(this string value, int position)
    {
        //do something
    }
}

使用方法:

string s = "Test";
char c = s.CharAt(2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接