gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:08:24 25 4
gpt4 key购买 nike

我正在制作一个双向字典类,以允许我在任一方向上进行快速查找。

我的类(class)看起来(部分)像这样:

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>不会编译?我可以在构造函数中抛出异常,但如果它在编译时被捕获就好了。

最佳答案

好吧,如果允许的话,拥有两个索引器将是一个非常糟糕的设计。

有这本字典:

var foo = new DoubleDictionary<int, int>();
foo.Add(3, 4);
foo.Add(2, 3);

然后做:

foo[3]

您希望得到 2 个吗?还是4?为什么?

最好把API说清楚。

关于c# - 避免泛型类型的模糊调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5655411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com