Как перегрузить оператор квадратной скобки в С#?
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;
}
}
}