How do I overload the square-bracket operator in C#?
例如,DataGridView允许您执行以下操作:
1 2 | DataGridView dgv = ...; DataGridViewCell cell = dgv[1,5]; |
但在我的一生中,我找不到关于索引/方括号运算符的文档。他们叫它什么?在哪里实施?它能扔吗?我怎么能在自己的课上做同样的事情呢?
埃塔:谢谢你的快速回答。简而言之:相关文档位于"item"属性下;重载的方法是声明一个属性,如
埃塔:好吧,尽管文档没有提到它(淘气的微软!),结果是,如果为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] { // ... } } |
如果您使用的是C 6或更高版本,则可以将表达式体语法用于只获取索引器:
对于CLI C++(编译为/CLR),请参见此MSDN链接。
简而言之,属性可以被命名为"默认值":
1 2 3 4 5 6 7 8 | ref class Class { public: property System::String^ default[int i] { System::String^ get(int i) { return"hello world"; } } }; |
下面是一个从内部列表对象返回值的示例。应该给你个主意。
1 2 3 4 5 | public object this[int index] { get { return ( List[index] ); } set { List[index] = value; } } |
。
如果您的意思是数组索引器,则只需编写一个索引器属性即可重载它。并且,只要每个索引器的参数签名不同,就可以重载(根据需要编写任意多个)索引器属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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; } } } |
。