Как перегрузить оператор квадратной скобки в С#?

DataGridView, например, позволяет это сделать:

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

но для жизни я не могу найти документацию по оператору index/square-bracket. Как они это называют? Где это реализовано? Может ли это бросить? Как я могу сделать то же самое в своих классах?

ETA: Спасибо за все быстрые ответы. Вкратце: соответствующая документация находится в собственности "Предмет"; способ перегрузки - объявить свойство типа public object this[int x, int y]{ get{...}; set{...} }; индексщик DataGridView не бросает, по крайней мере, согласно документации. Он не упоминает, что произойдет, если вы указали неверные координаты.

ETA Снова: ОК, даже если документация не упоминает об этом (непослушный Microsoft!), оказывается, что индексщик для DataGridView фактически выкинет исключение ArgumentOutOfRangeException, если вы предоставите ему недопустимые координаты. Справедливое предупреждение.

Ответ 1

Вы можете найти, как это сделать здесь. Короче это:

public object this[int i]
{
    get { return InnerList[i]; }
    set { InnerList[i] = value; }
}

Если вам нужен только геттер, можно использовать синтаксис в ответе ниже (начиная с С# 6).

Ответ 2

Это будет свойство item: http://msdn.microsoft.com/en-us/library/0ebtbkkc.aspx

Возможно, что-то вроде этого будет работать:

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

Ответ 3

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!

Источник информации

Для скобки:

public Object this[int index]
{

}

НО

Оператор индексирования массива не может быть перегружен; однако типы могут определять индексы, свойства, которые принимают один или несколько параметров. Параметры индексатора заключены в квадратные скобки, как и индексы массива, но параметры индексатора могут быть объявлены как произвольные (в отличие от индексов массива, которые должны быть целыми).

Из MSDN

Ответ 4

public class CustomCollection : List<Object>
{
    public Object this[int index]
    {
        // ...
    }
}

Ответ 5

Для CLI С++ (скомпилированный с /clr ) см. эту ссылку MSDN.

Короче говоря, свойству может быть присвоено имя "default":

ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};

Ответ 6

Если вы используете С# 6 или более позднюю версию, вы можете использовать синтаксис с выражением-выражением для индексатора get-only:

public object this[int i] => this.InnerList[i];

Ответ 7

Вот пример, возвращающий значение из внутреннего объекта List. Должна дать вам эту идею.

  public object this[int index]
  {
     get { return ( List[index] ); }
     set { List[index] = value; }
  }

Ответ 8

Если вы имеете в виду индексатор массива, вы перегружаете его, просто записывая свойство индексатора. И вы можете перегружать (писать столько, сколько хотите) свойств индексатора, если у каждого есть другая сигнатура параметра

public class EmployeeCollection: List<Employee>
{
    public Employee this[int employeeId]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.EmployeeId == employeeId)
                    return emp;
            }

            return null;
        }
    }

    public Employee this[string employeeName]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.Name == employeeName)
                    return emp;
            }

            return null;
        }
    }
}