• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

避免泛型类型的模糊调用错误

c/c++ 来源:captncraig 3次浏览

我有一个双向字典类,我正在允许我在任一方向执行快速查找。避免泛型类型的模糊调用错误

我的长相类(部分)如下:

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 – 甚至可以通过扩展方法,也许这样你就可以通过添加using指令发挥他们……


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)