[C#] C #에서 대괄호 연산자를 어떻게 과부하합니까?

예를 들어 DataGridView를 사용하면 다음을 수행 할 수 있습니다.

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

그러나 내 인생에서 색인 / 대괄호 연산자에 대한 문서를 찾을 수 없습니다. 그들은 그것을 무엇이라고 부릅니까? 어디에서 구현됩니까? 던질 수 있습니까? 내 수업에서 어떻게 똑같은 일을 할 수 있습니까?

ETA : 모든 빠른 답변에 감사드립니다. 간단히 : 관련 문서는 “항목”속성에 있습니다. 오버로드하는 방법은 다음과 같은 속성을 선언하는 것입니다 public object this[int x, int y]{ get{...}; set{...} }. 적어도 문서에 따르면 DataGridView의 인덱서는 throw되지 않습니다. 유효하지 않은 좌표를 제공하면 어떻게되는지 언급하지 않습니다.

ETA 다시 : OK, 문서에서 언급하지 않았지만 (Microsoft가 아닙니다!) 잘못된 좌표를 제공하면 DataGridView의 인덱서에서 ArgumentOutOfRangeException이 발생합니다. 공정한 경고.



답변

여기에서 방법을 찾을 수 있습니다 . 간단히 말해 :

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

게터 만 필요한 경우 아래 답변 의 구문을 사용할 수도 있습니다 (C # 6부터).


답변

이것이 항목 속성이 될 것입니다 : 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;
}


답변

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


답변

C # 6 이상을 사용하는 경우 get-only indexer에 표현식 본문 구문을 사용할 수 있습니다.

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


답변

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


답변

/ clr로 컴파일 된 CLI C ++에 대해서는 이 MSDN 링크를 참조하십시오 .

간단히 말해, 속성에 “default”라는 이름을 지정할 수 있습니다.

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


답변

다음은 내부 List 객체에서 값을 반환하는 예입니다. 당신에게 아이디어를 제공해야합니다.

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