代码之家  ›  专栏  ›  技术社区  ›  Coderer

如何在C#中重载方括号运算符?

  •  223
  • Coderer  · 技术社区  · 16 年前

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

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

    8 回复  |  直到 16 年前
        1
  •  390
  •   Ruben    5 年前

    你可以找到怎么做 here .

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

    如果您只需要一个getter,那么 answer below

        2
  •  42
  •   Ricardo Villamil    16 年前

    这将是项属性: 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; 
    }
    
        3
  •  27
  •   William Lcf.vs    11 年前
    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!
    

    Source of the information

    括号:

    public Object this[int index]
    {
    
    }
    

    不能超载 ; 但是,类型可以定义索引器,即接受一个或多个参数的属性。索引器参数用方括号括起来,就像数组索引一样,但索引器参数可以声明为任何类型(与数组索引不同,数组索引必须是整数)。

    MSDN

        4
  •  13
  •   amoss    8 年前

    如果您使用的是C#6或更高版本,则可以对仅获取索引器使用表达式体语法:

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

        5
  •  5
  •   Jason Miesionczek    16 年前
    public class CustomCollection : List<Object>
    {
        public Object this[int index]
        {
            // ...
        }
    }
    
        6
  •  3
  •   superjordo superjordo    16 年前

    this MSDN link .

    简言之,属性可以命名为“default”:

    ref class Class
    {
     public:
      property System::String^ default[int i]
      {
        System::String^ get(int i) { return "hello world"; }
      }
    };
    
        7
  •  2
  •   Rob Prouse    16 年前

      public object this[int index]
      {
         get { return ( List[index] ); }
         set { List[index] = value; }
      }
    
        8
  •  1
  •   vzwick pasujemito    7 年前

    如果您指的是数组索引器,则只需编写索引器属性即可重载它。。而且,只要索引器属性具有不同的参数签名,就可以重载(写入任意数量的)索引器属性

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