264

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

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

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

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

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

4

8 に答える 8

392

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

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

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

于 2008-11-13T19:25:19.957 に答える
43

これがアイテムのプロパティになります: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; 
}
于 2008-11-13T19:26:09.440 に答える
28
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から

于 2008-11-13T19:23:43.860 に答える
13

C# 6 以降を使用している場合は、取得専用インデクサーに式形式の構文を使用できます。

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

于 2015-12-04T22:06:58.450 に答える
5
public class CustomCollection : List<Object>
{
    public Object this[int index]
    {
        // ...
    }
}
于 2008-11-13T19:25:08.443 に答える
3

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

つまり、プロパティに「デフォルト」という名前を付けることができます。

ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};
于 2008-11-21T20:36:57.047 に答える
2

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

  public object this[int index]
  {
     get { return ( List[index] ); }
     set { List[index] = value; }
  }
于 2008-11-13T19:27:48.720 に答える
1

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

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;
        }
    }
}
于 2008-11-13T19:29:14.753 に答える