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

インターフェイス (C# リファレンス) に対してインデクサーを宣言できます。 インターフェイス インデクサーのアクセサーは、クラスのインデクサーと次の点が異なります。

  • インターフェイスのアクセサーは修飾子を使用しません。

  • インターフェイスのアクセサーには本体がありません。

したがって、アクセサーの目的は、インデクサーが読み取り/書き込み、読み取り専用、または書き込み専用のいずれであるかを示すことです。

次に示すのは、インターフェイス インデクサーのアクセサーの例です。

public interface ISomeInterface
{
    //... 

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

インデクサーのシグネチャは、同じインターフェイスで宣言されている他のすべてのインデクサーのシグネチャとは異なるシグネチャである必要があります。

使用例

次の例は、インターフェイスのインデクサーの実装方法を示しています。

    // 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
     */

前の例では、インターフェイス メンバーの完全限定名を使うことで、明示的なインターフェイス メンバーの実装を使用できます。 次に例を示します。

public string ISomeInterface.this 
{ 
} 

ただし、完全限定名は、同じインデクサー シグネチャを持つ複数のインターフェイスがクラスで実装されている場合に、あいまいさを避けるためだけに必要です。 たとえば、 Employee クラスが 2 つのインターフェイス ICitizen と IEmployee を実装し、両方のインターフェイスに同じインデクサー シグネチャがある場合は、明示的なインターフェイス メンバーの実装が必要になります。 つまり、次のインデクサー宣言では、IEmployee インターフェイスのインデクサーが実装されます。

public string IEmployee.this 
{ 
} 

一方、次の宣言では ICitizen インターフェイスのインデクサーが実装されます。

public string ICitizen.this 
{ 
} 

参照

関連項目

インデクサー (C# プログラミング ガイド)

プロパティ (C# プログラミング ガイド)

インターフェイス (C# プログラミング ガイド)

概念

C# プログラミング ガイド