带有枚举键类型的KeyedCollection不会按int索引

时间:2009-05-06 19:19:31

标签: c# .net

我有课程

public class FooKeyedCollection : KeyedCollection<FooType,Foo>
{
}

public enum FooType
{
   FooType1,
   FooType2,
   FooType3
}

public Foo
{
   public FooType Type { get; set; }
   public string Value { get; set; }
}

当我向FooKeyedCollection添加项目时,我可以通过FooType对它们进行索引,但是当我尝试将它们编入索引时,int被解释为FooType枚举。结果,它导致了一个令人困惑的错误,即

public static void main()
{
   FooKeyedCollection fkc = new FooKeyedCollection();

   Foo myFoo = new Foo();
   myFoo.Type = FooType.FooType3;
   myFoo.Value = "someValue";

   foo.Add( myFoo );

   Foo myFooByType = foo[FooType.FooType3];
   Foo myFooByIndex = foo[0]; // <-- exception thrown here
}

尝试通过整数索引检索项时,执行此代码的结果是一个例外。我希望将FooKeyedCollection作为公共API的一部分公开,我希望保护此API的使用者免受此错误的影响。有什么办法可以修改FooKeyedCollection类来获得正确的行为吗?

3 个答案:

答案 0 :(得分:3)

您可以考虑在此处使用“new”关键字:

public new Foo this[int index]
{
   get
   {
      IList<Foo> self = this;
      return self[index];
   }
   set
   {
       (IList<Foo>)[index] = value;
   }
}

这将允许您按整数值进行索引。明确地使用枚举将回退到KeyedCollection实现。

答案 1 :(得分:3)

这是一个有用的扩展方法,可以避免这两个索引器重叠的情况 - 如果密钥为int,它也有帮助:

static class CollectionUtils
{
    public static TValue GetByIndex<TKey,TValue>
        (this KeyedCollection<TKey, TValue> collection, int index)
    {
        return collection[index];
    }
}

然后调用fkc.GetByIndex(0),它会正常工作。在通用方法中,它只能 解析indexint索引器。

答案 2 :(得分:2)

问题是0可以隐式转换为FooType。如果你使用任何其他号码,它会没事的。如果您使用此代码,它也应该起作用:

int index = 0;
Foo myFooByIndex = foo[index];

编辑:不幸的是,强制转换在这里没有帮助 - 编译器仍将其识别为常量0。