我有一個雙向字典類,我正在允許我在任一方向執行快速查找。避免泛型類型的模糊調用錯誤
我的長相類(部分)如下:
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