我有课程
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类来获得正确的行为吗?
答案 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)
,它会正常工作。在通用方法中,它只能 解析index
到int
索引器。
答案 2 :(得分:2)
问题是0可以隐式转换为FooType
。如果你使用任何其他号码,它会没事的。如果您使用此代码,它也应该起作用:
int index = 0;
Foo myFooByIndex = foo[index];
编辑:不幸的是,强制转换在这里没有帮助 - 编译器仍将其识别为常量0。