Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中重载方括号运算符?_C#_Collections_Operators_Operator Overloading - Fatal编程技术网

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

如何在C#中重载方括号运算符?,c#,collections,operators,operator-overloading,C#,Collections,Operators,Operator Overloading,例如,DataGridView允许您执行以下操作: DataGridView dgv = ...; DataGridViewCell cell = dgv[1,5]; 但就我个人而言,我找不到有关索引/方括号运算符的文档。他们叫它什么?它在哪里实施?它会扔吗?我怎么能在自己的课堂上做同样的事情呢 埃塔:谢谢你的快速回答。简要说明:相关文件在“项目”属性下;重载的方法是通过声明一个类似于的属性this[intx,inty]{get{…};set{…};至少根据文档,DataGridView的索引

例如,DataGridView允许您执行以下操作:

DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];
但就我个人而言,我找不到有关索引/方括号运算符的文档。他们叫它什么?它在哪里实施?它会扔吗?我怎么能在自己的课堂上做同样的事情呢

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

ETA:好吧,尽管文档中没有提到它(淘气的微软!),但事实证明,如果您为DataGridView索引器提供无效坐标,它实际上会抛出ArgumentOutOfRangeException。公平的警告

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!
但是 数组索引运算符不能重载;但是,类型可以定义索引器,即接受一个或多个参数的属性。索引器参数用方括号括起来,就像数组索引一样,但索引器参数可以声明为任何类型(与数组索引不同,数组索引必须是整数)

公共类CustomCollection:列表
{
公共对象此[int索引]
{
// ...
}
}
您可以找到如何做。 简言之,它是:

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

如果您只需要一个getter,也可以使用中的语法(从C#6开始)。

这将是item属性:

也许像这样的方法会奏效:

public T Item[int index, int y]
{ 
    //Then do whatever you need to return/set here.
    get; set; 
}

下面是一个从内部列表对象返回值的示例。我应该告诉你这个想法

  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;
        }
    }
}
公共类EmployeeCollection:列表
{
公共雇员本[int employeeId]
{   
得到
{ 
foreach(本文件中的var emp)
{
如果(emp.EmployeeId==EmployeeId)
返回emp;
}
返回null;
}
}
公共雇员此[字符串employeeName]
{   
得到
{ 
foreach(本文件中的var emp)
{
如果(emp.Name==员工姓名)
返回emp;
}
返回null;
}
}
}
< CL/C++ >(编译为/CLR)参见
简言之,属性可以命名为“default”:

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



公共对象this[int i]=>this.InnerList[i]

非常感谢!如果我能给出两个答案,我也会加上你的答案——没有人知道如何在文档中查找项……就如何实现而言,它是“项”,但在C#术语中,它是“this”对的,但我问“为了我的生命,我找不到索引/方括号运算符上的文档”——我的意思是当你在MSDN中查找库类时,他们在哪里告诉你接线员的事?这就是为什么我对它抛出的内容做了最后一个“ETA”——文档是错误的。是的,它可以重载,只要参数签名不同,就像任何其他方法的重载限制一样。它可以,但不是针对我编写的条件。来自MSDN。如果我误读了你的文章,如果你不相信meSorry,请检查来源,但你指的是什么情况?+1可供参考。仅供参考链接已失效。(4年后,我知道)我想补充一点,您现在可以在C#now中重写隐式和显式类型转换。事实上,这非常危险-您现在有两个相互竞争的实现:任何具有类型为List或IList或IList等的变量的人都不会执行您的自定义代码。同意——如果没有其他内容,没有必要从列表中派生CustomCollection,但我没有意识到这实际上很危险,尽管它仍然会执行自定义代码,不是吗?声明什么类型的变量并不重要,重要的是对象的类型。C#多态性的友好提示:发生这种情况是因为基类没有将其实现声明为虚拟的。如果它被声明为虚拟的,则在任何情况下都会调用自定义代码。此外,由于两个索引器都是非虚拟的,因此此代码将向您发出编译器警告。编译器将建议您使用
new
关键字限定自定义索引器。首先,您指的是this[],而不是this()-但是,在列表(IList/IList/list)上提供自定义(但不同)this[int]是非常危险的,并且可能会导致“int index”和“int employeeId”版本之间出现微妙的错误。两个人都可以打电话。事实上,我不知道;我不认为我在上面输入的代码在编译时不会添加新的或重写语句,因为存在这个[int]的列表实现。当你这样做的时候,你的潜在能力是正确的,仅仅意味着它是一个重载索引器的例子。一个次要的评论:根据你所做的,你可能会发现它更适合这样做:get{return base[i];}set{base[i]=value;}这不是操作符重载。它是索引器,也可以是一元运算符。2019年,应选择一个新答案。太糟糕了,所以没有一个功能来处理不推荐的答案,因为新的答案不太可能获得350多张赞成票,尽管这是值得的。@mins 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;
        }
    }
}
ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};