c#中的索引器程序

时间:2010-09-04 11:50:13

标签: c#

此程序中有错误。任何人都可以解决此问题吗?

class TempRecord
{
    // Array of temperature values
    private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 
                                        61.3F, 65.9F, 62.1F, 59.2F, 57.5F };
    private int[] d= new int[10]{4,5,5,4,4,43,2,2,5,3};
    // To enable client code to validate input 
    // when accessing your indexer.
    //public int Length
    //{
    //    get { return temps.Length; }
    //}
    // Indexer declaration.
    // If index is out of range, the temps array will throw the exception.
    public float this[int index]
    {
        get
        {
            return temps[index];
        }

        set
        {
            temps[index] = value;
        }
    }
    public int this[int index]
    {
        get
        {
            return d[index];
        }

        set
        {
            d[index] = value;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        TempRecord tempRecord = new TempRecord();
        // Use the indexer's set accessor
        tempRecord[3] = 58.3F;
        tempRecord[5] = 60.1F;



        // Use the indexer's get accessor
        for (int i = 0; i < 10; i++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);
        }
        Console.WriteLine(tempRecord[2]);
        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();

    }
}

2 个答案:

答案 0 :(得分:1)

  

类型'ConsoleApplication1.TempRecord'已经定义了一个名为'this'的成员,其参数类型相同

这是你的错误吗?

如果是 - 请阅读它所说的内容=)您有两个this成员,也称为Indexers,具有相同的方法签名。具体做法是:

public float this[int index]
public int this[int index]

请记住,对于消除歧义,不考虑返回类型。您需要删除一个完整的或将其更改为方法,而不是索引器。

想象一下,如果它被允许并且你有以下代码:

var record = new TempRecord();
object value = record[3];

应该在这里调用哪个索引器?返回float或返回int的那个。是的,这个例子是设计的,但从语言设计和编译器实现的角度来看,它是完全有效的,因此你不能通过返回类型重载。

答案 1 :(得分:1)

正如GenericTypeTea所说,说你有一些错误太模糊,不能期待任何一种全面的反应。但是,我可以告诉你,你只是试图根据返回类型重载索引器属性,这在C#中是不可能的(或者我知道的任何多态语言)。

此外,同时提供数组大小和初始化列表是稍后要求维护问题。此代码编译是因为初始化程序列表中的元素数量和大小匹配,但如果您更改了一个而忘记更改另一个,则会开始收到编译器错误。就个人而言,如果您使用初始化列表,我会建议使用空括号,但我认为这可以归结为个人偏好。