gpt4 book ai didi

c# - 带有 IDictionary 和 IEnumerable 的嵌套泛型

转载 作者:太空狗 更新时间:2023-10-30 00:35:08 29 4
gpt4 key购买 nike

在内部可重用库的通用 C# 类中,我想传递对“映射到其他事物列表的事物”的引用。库不应该知道传入的数据类型。此外,它们的存储方式也不应为人所知,即今天保存在内存中的列表,以后可能是按需读取的数据库表。

所以我想我应该写这个库类:

class GenericClass<T, U>
{
public void Foo(IDictionary<T, IEnumerable<U>> bar)
{
// do something
}
}

这会编译,但尝试传递具体实现不会:

class UsingClass
{
public static void Main(string[] args)
{
var c = new GenericClass<string, string>();
c.Foo(new Dictionary<string, List<string>>());
}
}

我收到以下两个语法错误:

Filename.cs(46,13): error CS1502: The best overloaded method match for 'GenericClass<string,string>.Foo(System.Collections.Generic.IDictionary<string,System.Collections.Generic.IEnumerable<string>>)' has some invalid arguments
Filename.cs(46,19): error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.Dictionary<string,System.Collections.Generic.List<string>>' to 'System.Collections.Generic.IDictionary<string,System.Collections.Generic.IEnumerable<string>>'

List 替换 Foo() 声明中的 IEnumerable 修复了它,但这当然不是我想要的。

这真的不受 C# (4.0) 支持,还是我只是遗漏了一些明显的东西?你会建议什么解决方法? (我敢肯定这已经被讨论过很多次了,所以链接到很棒的描述也很好。)

是的,我应该能够为此编写自己的帮助程序类,但为什么我必须这样做?

最佳答案

是的,这个真的不支持。想象一下您的 Foo 方法如下所示:

public void Foo(IDictionary<T, IEnumerable<U>> bar)
{
T key = GetKeyFromSomewhere();
bar[key] = new U[10]; // Create an array
}

这看起来不错,不是吗?我们可以从 U[] 转换至 IEnumerable<U> .

虽然从调用者的角度来看并不是很好 - 突然我们得到了一个 string[]字典中的引用值,当所有值都为 List<string> 时引用! Bang 实现了类型安全。

您可以将方法重写为:

public void Foo<TValue>(IDictionary<T, TValue> bar)
where TValue : IEnumerable<U>

这将使您从字典中 获取值并将它们转换为 IEnumerable<U>隐式...但你只能将正确类型的值放入字典,而你不能仅从 U 构建它值(value)。

从版本 4 开始,C# 在受限情况下支持generic variance。因此,例如,这适用于 C# 4(当面向 .NET 4 时)但以前不会:

List<string> strings = new List<string>();
IEnumerable<object> objects = strings;

有关很多更多关于一般方差的信息,请参阅 Eric Lippert's blog series关于这个话题。为您的大脑定期爆炸做好准备。

关于c# - 带有 IDictionary 和 IEnumerable 的嵌套泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5584551/

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