Как перегрузить оператор квадратных скобок в 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
для CLI C++ (скомпилированный с /clr) см. это ссылка MSDN.
короче говоря, свойству можно присвоить имя "default":
ref class Class { public: property System::String^ default[int i] { System::String^ get(int i) { return "hello world"; } } };
Если вы используете C# 6 или более позднюю версию, вы можете использовать синтаксис выражения для индексатора get-only:
public object this[int i] => this.InnerList[i];
вот пример, возвращающий значение из внутреннего объекта списка. Должен дать вам идею.
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; } } }
Comments