インターフェイスのインデクサー (C# プログラミング ガイド)Indexers in Interfaces (C# Programming Guide)

interface でインデクサーを宣言することができます。Indexers can be declared on an interface. インターフェイスのインデクサーのアクセサーは、クラスのインデクサーのアクセサーと次の点で異なります。Accessors of interface indexers differ from the accessors of class indexers in the following ways:

  • インターフェイスのアクセサーは、修飾子は使用しません。Interface accessors do not use modifiers.

  • インターフェイスのアクセサーには、本文はありません。An interface accessor does not have a body.

したがって、アクセサーの目的は、インデクサーが読み取り/書き込み、読み取り専用、または書き込み専用のどれかを示すことです。Thus, the purpose of the accessor is to indicate whether the indexer is read-write, read-only, or write-only.

インターフェイスのインデクサー アクセサーの例を次に示します。The following is an example of an interface indexer accessor:

public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}

インデクサーのシグネチャは、同じインターフェイスで宣言されている他のすべてのインデクサーの署名とは異なる必要があります。The signature of an indexer must differ from the signatures of all other indexers declared in the same interface.

Example

次の例では、インターフェイスのインデクサーを実装する方法について説明します。The following example shows how to implement interface indexers.

// Indexer on an interface:
public interface ISomeInterface
{
    // Indexer declaration:
    int this[int index]
    {
        get;
        set;
    }
}

// Implementing the interface.
class IndexerClass : ISomeInterface
{
    private int[] arr = new int[100];
    public int this[int index]   // indexer declaration
    {
        get
        {
            // The arr object will throw IndexOutOfRange exception.
            return arr[index];
        }
        set
        {
            arr[index] = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        IndexerClass test = new IndexerClass();
        System.Random rand = new System.Random();
        // Call the indexer to initialize its elements.
        for (int i = 0; i < 10; i++)
        {
            test[i] = rand.Next();
        }
        for (int i = 0; i < 10; i++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Sample output:
    Element #0 = 360877544
    Element #1 = 327058047
    Element #2 = 1913480832
    Element #3 = 1519039937
    Element #4 = 601472233
    Element #5 = 323352310
    Element #6 = 1422639981
    Element #7 = 1797892494
    Element #8 = 875761049
    Element #9 = 393083859
 */

前の例では、インターフェイス メンバーの完全修飾名を使用して明示的なインターフェイス メンバーの実装を使用することができます。In the preceding example, you could use the explicit interface member implementation by using the fully qualified name of the interface member. 次に例を示します。For example:

string ISomeInterface.this[int index]   
{   
}   

ただし、完全修飾名は、クラスが同じインデクサーの署名を持つ 2 つ以上のインターフェイスを実装するときにあいまいさを避けるためにのみ必要です。However, the fully qualified name is only needed to avoid ambiguity when the class is implementing more than one interface with the same indexer signature. たとえば、Employee クラスが 2 つのインターフェイス ICitizenIEmployee を実装し、両方のインターフェイスが同じインデクサーの署名を持っている場合、明示的なインターフェイス メンバーの実装が必要です。For example, if an Employee class is implementing two interfaces, ICitizen and IEmployee, and both interfaces have the same indexer signature, the explicit interface member implementation is necessary. つまり、次のインデクサーの宣言があります。That is, the following indexer declaration:

string IEmployee.this[int index]   
{   
}   

これは、IEmployee インターフェイス上でインデクサーを実装します。次の宣言があります。implements the indexer on the IEmployee interface, while the following declaration:

string ICitizen.this[int index]
{   
}   

これは、ICitizen インターフェイスでインデクサーを実装します。implements the indexer on the ICitizen interface.

関連項目See also