索引器不应该使用任何输入类型吗?

时间:2013-07-11 20:49:12

标签: c#

根据this

  

“索引器不必用整数值索引;它最多可以   你如何定义特定的查找机制。“

但是下面的代码会出现异常

  

未处理的异常:System.IndexOutOfRangeException:索引是   在数组范围之外。

using System; 
using System.Linq; 

namespace ConsoleApplication
{
    class Program
    {
        private static string fruits;

        static void Main(string[] args)
        {
            fruits = "Apple,Banana,Cantaloupe";
            Console.WriteLine(fruits['B']);
        }

        public string this[char c] // indexer 
        { 
            get
            {    
              var x=  fruits.Split(',');    
                return x.Select(f => f.StartsWith(c.ToString())).SingleOrDefault().ToString();    
            }    
        }
    }
}

上面的代码不应该能够使用char索引而不是int索引吗?

3 个答案:

答案 0 :(得分:6)

您的链接指的是您自己定义的索引器:

public T this[int i]

但是您没有使用已定义的索引器,而是使用string类的索引器,该类被定义为采用int参数。

其他类 被其他类型编入索引 - 例如,Dictionary<TKey,TValue>TKey编入索引:

var dic = new Dictionary<string,int>();
dic["hello"] = 1;

答案 1 :(得分:3)

您未在示例中使用索引器,为类Program创建了索引器,但您需要在类String上使用索引器。

即使索引器期望int是一个字符也可以转换为int,它仍然可以工作的原因所以在你的代码中你真的在做什么

Console.WriteLine(fruits[((int)'B')]);

答案 2 :(得分:3)

Main是一个静态方法,您尝试访问类Program的非静态属性。您定义的索引器甚至没有远程连接到String类。要引用您的索引器,您需要:

Program program = new Program();
program.fruits = "Bananas";
Console.WriteLine(program['B']);

但上面的代码是可怕的,你永远不应该使用这样的怪物。相反,声明另一个类并在那里实现索引器;