Как перегрузить оператор квадратной скобки в C#?
DataGridView, например, позволяет вам сделать это:
DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];
но для жизни я не могу найти документацию по оператору индекса / квадратной скобки. Как они это называют? Где это реализовано? Это может бросить? Как я могу сделать то же самое в моих собственных классах?
ETA: Спасибо за все быстрые ответы. Вкратце: соответствующая документация находится в собственности "Item"; способ перегрузки путем объявления свойства как public object this[int x, int y]{ get{...}; set{...} }
; индексатор для DataGridView не выбрасывает, по крайней мере, согласно документации. Не упоминается, что произойдет, если вы введете неверные координаты.
ETA Опять же: ОК, хотя в документации об этом не упоминается (непослушная Microsoft!), Оказывается, что индексатор для DataGridView фактически выдаст исключение ArgumentOutOfRangeException, если вы предоставите ему недопустимые координаты. Справедливое предупреждение.
8 ответов
Вы можете найти, как это сделать здесь. Короче это:
public object this[int i]
{
get { return InnerList[i]; }
set { InnerList[i] = value; }
}
Это будет свойство элемента: 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;
}
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
Если вы используете C# 6 или новее, вы можете использовать синтаксис тела выражения для индексатора только для получения:
public object this[int i] => this.InnerList[i];
public class CustomCollection : List<Object>
{
public Object this[int index]
{
// ...
}
}
Для CLI C++ (скомпилировано с /clr) смотрите эту ссылку MSDN.
Вкратце, свойству может быть присвоено имя "default":
ref class Class
{
public:
property System::String^ default[int i]
{
System::String^ get(int i) { return "hello world"; }
}
};
Вот пример, возвращающий значение из внутреннего объекта List. Должен дать вам идею.
public object this[int index]
{
get { return ( List[index] ); }
set { List[index] = value; }
}
Если вы имеете в виду индексатор массива, вы перегружаете его, просто записывая свойство индексатора. И вы можете перегружать (записывать столько, сколько хотите) свойств индексатора, если каждый из них имеет свою сигнатуру параметра
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;
}
}
}