Share via

Facebook x.com LinkedIn Email

Indexers in Interfaces (C# Programming Guide)

  • 2013年02月15日

Indexers can be declared on an interface (C# Reference). 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:

public string ISomeInterface.this 
{ 
} 

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. 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:

public string IEmployee.this 
{ 
} 

implements the indexer on the IEmployee interface, while the following declaration:

public string ICitizen.this 
{ 
} 

implements the indexer on the ICitizen interface.

See Also

Tasks

Indexers Sample

Concepts

C# Programming Guide

Reference

Indexers (C# Programming Guide)

Properties (C# Programming Guide)

Interfaces (C# Programming Guide)