关于集合:如何在C#中重载方括号运算符?

How do I overload the square-bracket operator in C#?

例如,DataGridView允许您执行以下操作:

1
2
DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];

但在我的一生中,我找不到关于索引/方括号运算符的文档。他们叫它什么?在哪里实施?它能扔吗?我怎么能在自己的课上做同样的事情呢?

埃塔:谢谢你的快速回答。简而言之:相关文档位于"item"属性下;重载的方法是声明一个属性,如public object this[int x, int y]{ get{...}; set{...} };DataGridView的索引器不会抛出,至少根据文档是这样的。它没有提到如果提供无效的坐标会发生什么。

埃塔:好吧,尽管文档没有提到它(淘气的微软!),结果是,如果为DataGridView提供无效坐标,则它的索引器实际上将引发ArgumentOutOfRangeException。公平警告。


你可以在这里找到怎么做。简而言之,它是:

1
2
3
4
5
public object this[int i]
{
    get { return InnerList[i]; }
    set { InnerList[i] = value; }
}


这将是item属性:http://msdn.microsoft.com/en-us/library/0ebtbkcc.aspx

也许像这样的事情会奏效:

1
2
3
4
5
public T Item[int index, int y]
{
    //Then do whatever you need to return/set here.
    get; set;
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Operators                           Overloadability

+, -, *, /, %, &, |, <<, >>         All C# binary operators can be overloaded.

+, -, !,  ~, ++, --, true, false    All C# unary operators can be overloaded.

==, !=, <, >, <= , >=               All relational operators can be overloaded,
                                    but only as pairs.

&&, ||                  They can't be overloaded

() (Conversion operator)        They can'
t be overloaded

+=, -=, *=, /=, %=                  These compound assignment operators can be
                                    overloaded. But in C#, these operators are
                                    automatically overloaded when the respective
                                    binary operator is overloaded.

=, . , ?:, ->, new, is, as, sizeof  These operators can't be overloaded

    [ ]                             Can be overloaded but not always!

信息来源

对于支架:

1
2
3
4
public Object this[int index]
{

}

号但是

不能重载数组索引运算符;但是,类型可以定义索引器、接受一个或多个参数的属性。索引器参数被括在方括号中,就像数组索引一样,但是索引器参数可以声明为任何类型(与数组索引不同,数组索引必须是整数)。

来自msdn


1
2
3
4
5
6
7
public class CustomCollection : List<Object>
{
    public Object this[int index]
    {
        // ...
    }
}