我有一个双向字典类,我正在允许我在任一方向执行快速查找。避免泛型类型的模糊调用错误
我的长相类(部分)如下:
public class DoubleDictionary<A,B>
{
private Dictionary<A, B> _forward;
private Dictionary<B, A> _backward;
public A this[B b]
{
get { return _backward[b]; }
set { _backward[b] = value; }
}
public B this[A a]
{
get { return _forward[a]; }
set { _forward[a] = value; }
}
}
我使用数组索引操作在这个例子中,但几乎每一个方法有两个通用版本。它的情况下的伟大工程除了其中A == B.
如果我做
var foo = new DoubleDictionary<int, int>();
int x = foo[3];
它甚至不会编译,因为不明确的索引的。
我明白为什么编译器有这个问题,我同意它可能不合法。
让我们假设我实际上有一个有效的用例需要DoubleDictionary<int,int>
,我随意选择数组索引应该访问正向字典。
我为解决所有这些问题而提出的解决方案是放弃每个方向的唯一命名方法的灵活索引语法。这使得它不那么神奇,并且不那么有趣。
有什么办法可以让编译器提示解决歧义而不必求助于唯一命名的方法吗?我真的很喜欢这种重载的想法,并希望保持这种状态。我更喜欢在课堂上这样做,因此调用者不必担心它,但我想象调用者将不得不做一些反射魔术来使其工作。
如果它不可能,我会保持克制,以便A不能与B相同。有没有什么方法可以编码,以便DoubleDictionary<int,int>
的声明不会编译?我可以在构造函数中抛出一个异常,但如果它在编译时被捕获,它会很好。
“这使得它变得更加神奇,而且更加有趣。”我认为它会改进设计并使API更清晰。 – 2011-04-13 20:50:00
公平的一点。我仍然喜欢数组索引,因为它更像是Dictionary类的索引,它非常简洁。 – captncraig 2011-04-13 20:52:28