我如何重载在C#中的方括号运算符?我如何重载在C#中的方括号运算符?(How do I overlo

2019-05-10 11:35发布

DataGridView的,例如,您可以这样做:

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

但对我的生活,我不能找到索引/方括号运算符的文件。 他们是怎么说的? 它在哪里实现? 它可以抛出? 我该怎么做我自己的类是一回事吗?

ETA:感谢所有的快速解答。 简述:相关文件是在“项目”属性; 超负荷的方式是通过声明一个属性等public object this[int x, int y]{ get{...}; set{...} } public object this[int x, int y]{ get{...}; set{...} } ; 为DataGridView的索引不会抛出,至少根据文档。 它没有提到如果提供无效的坐标发生了什么。

ETA还是那句话:OK,即使文件使得它没有提到(顽皮微软!),事实证明,对于DataGridView的索引实际上将抛出一个ArgumentOutOfRangeException,如果你有无效的坐标为它供给。 公平警告。

Answer 1:

你可以找到如何做到这一点在这里 。 总之,它是:

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


Answer 2:

这将是该项目属性: 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; 
}


Answer 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



Answer 4:

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


Answer 5:

对于CLI C ++(使用/ clr编译)看到此MSDN链接 。

总之,一个属性可以命名为“默认”:

ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};


Answer 6:

如果您使用C#6或更高版本,您可以使用GET-仅索引表达式健全语法:

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



Answer 7:

下面是一个例子返回从内部列表对象的值。 应该给你的想法。

  public object this[int index]
  {
     get { return ( List[index] ); }
     set { List[index] = value; }
  }


Answer 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;
        }
    }
}


文章来源: How do I overload the square-bracket operator in C#?