web-dev-qa-db-ja.com

C#で角括弧演算子をオーバーロードするにはどうすればよいですか?

たとえば、DataGridViewを使用すると、次のことができます。

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

しかし、私の人生では、インデックス/角括弧演算子のドキュメントは見つかりません。彼らはそれを何と呼んでいますか?どこに実装されていますか?投げられますか?自分のクラスで同じことを行うにはどうすればよいですか?

ETA:迅速な回答ありがとうございます。簡単に説明すると、関連するドキュメントは「アイテム」プロパティの下にあります。オーバーロードする方法は、public object this[int x, int y]{ get{...}; set{...} }のようなプロパティを宣言することです。少なくともドキュメントによると、DataGridViewのインデクサーはスローしません。無効な座標を指定するとどうなるかは言及されていません。

ETA再び:わかりました、ドキュメントではそれについて言及していませんが(Microsoftのいたずら!)、DataGridViewのインデクサーは、無効な座標を指定するとArgumentOutOfRangeExceptionを実際にスローすることがわかりました。公正警告。

235
Coderer

あなたはそれを行う方法を見つけることができます こちら 。要するに:

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

ゲッターのみが必要な場合は、 以下の回答 の構文も使用できます(C#6以降)。

356
Ruben

それがアイテムプロパティになります: 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; 
}
40
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]
{

}

しかし

配列インデックス演算子はオーバーロードできません;ただし、型は、1つ以上のパラメーターを受け取るプロパティであるインデクサーを定義できます。インデクサーパラメーターは、配列インデックスと同様に角かっこで囲まれていますが、インデクサーパラメーターは任意の型として宣言できます(配列インデックスは整数でなければなりません)。

MSDN から

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

CLI C++(/ clrでコンパイル)については、 このMSDNリンク を参照してください。

要するに、プロパティには「default」という名前を付けることができます。

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

C#6以降を使用している場合は、get-onlyインデクサーに式を使用した構文を使用できます。

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

4
amoss

以下は、内部のListオブジェクトから値を返す例です。あなたにアイデアを与える必要があります。

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

配列インデクサーを意味する場合、インデクサープロパティを記述するだけでオーバーロードできます。また、それぞれが異なるパラメーターシグネチャを持つ限り、インデクサープロパティをオーバーロードできます(必要な数だけ書き込む)。

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;
        }
    }
}
1
Charles Bretana