在C#中,能夠在類、結構或接口中用this關鍵字聲明索引器,在索引器內部用get或set訪問器訪問類中集合的某項值。所以能夠將索引器看做是類的屬性同樣去定義。索引器經常使用定義格式以下:測試
public int this[int index]{ get{ return 類內部的某個集合[index];} set{類內部的某個集合[index]=value;} }
索引器參數類型不僅是整型,還能夠用字符串,例如 public int this[string index]{.....}這樣的格式。this
今天所要討論的是接口索引器,以及繼承接口的類在內部如何定義索引器,客戶端怎麼調用這樣的索引器。spa
若是一個類,要繼承兩個接口,而這兩個接口裏面都聲明瞭一樣類型的索引器,那麼在這個類裏面怎麼去實現這兩個索引器呢?這種狀況下,派生類必須使用接口成員的徹底限定名來顯示實現接口的索引器。即在類中,this關鍵字前面必須加上接口名稱。我用vs2013測試了一下,若是存在這種索引器,那麼還不能在索引器前面加上public訪問修飾符,否則編譯通不過。客戶端在調用類對象索引器的時候,若是不用接口去裝載類對象,編譯也不能經過,並顯示「錯誤 2 沒法將帶 [] 的索引應用於「ConsoleAppTest.Program.Test」,這是由於類內部實現的是接口中的索引器,類沒有它本身的索引器,就像有點寄人籬下的感受。若是不用接口去裝載類對象,須要直接用類名去實例化一個對象,這時類內部須要定義它本身的索引器才行。以下代碼所示:code
public interface ITestOne { int this[int index]{get;set;} void Add(int value); } public interface ITestTwo { int this[int index] { get; set; } } //該類實現了接口的索引器,沒有自定義本身的索引器 //所以客戶端在調用的時候,須要用到接口去裝載類對象,才能使用接口索引器 //每一個接口只管它本身內部所聲明的成員,若是調用了不屬於該接口的成員,編譯通不過。 public class Test : ITestOne, ITestTwo { private int[] items; public Test() { items=new int[10]; } private int length=0; public void Add(int value) { items[length++] = value; } public int Length { get { return length; } } //不能加入public訪問修飾符,不然編譯通不過 int ITestOne.this[int index] { get { return items[index]; } set { items[index] = value; } } //不能加入public訪問修飾符,不然編譯通不過 int ITestTwo.this[int index] { get { return items[index]; } set { items[index] = value; } } } void main(){ //若是用ITestTwo test = new Test();的話,編譯通不過 //由於ITestTwo接口不包含Add方法的聲明 //正確的演示 ITestOne test = new Test(); test.Add(1); test.Add(2); Console.WriteLine(test[0]); //Test類沒有實現本身的索引器。 //若是Test類實現了本身的索引器,才能這樣作。即在Test類中加入public int this[int index]{......} //錯誤的演示 //Test test = new Test(); //test.Add(1); //test.Add(2); //Console.WriteLine(test[0]); }