我如何重载方括号操作符在c# ?

例如,DataGridView让你这样做:

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

但是无论如何我都找不到关于索引/方括号操作符的文档。他们叫它什么?它在哪里实现?它能扔吗?我怎么能在自己的课堂上做同样的事情呢?

埃塔:谢谢你的快速回答。简单地说:相关文件在“Item”属性下;重载的方法是通过声明public object this[int x, int y]{ get{...}; set{...} }这样的属性;DataGridView的索引器不会抛出,至少根据文档是这样的。它没有提到如果您提供无效的坐标会发生什么。

ETA:好的,即使文档没有提到它(淘气的微软!),事实证明,DataGridView的索引器实际上会抛出一个argumentoutofranceexception,如果你提供了无效的坐标。合理的警告。

143485 次浏览
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

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

你可以找到如何做在这里。 简而言之就是:

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

如果你只需要一个getter,也可以使用下面的回答中的语法(从c# 6开始)。

这将是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;
}

下面是一个从内部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;
}
}
}

关于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 indexer使用表达式体语法:

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