gpt4 book ai didi

c# - Linq ToDictionary 不会将类隐式转换为接口(interface)

转载 作者:太空狗 更新时间:2023-10-30 01:18:56 27 4
gpt4 key购买 nike

我有以下代码

public class TestAdaptor
{
private interface ITargetClass
{
Guid Id { get; }

string Name { get; }
}

private class MyTargetClass : ITargetClass
{
public Guid Id { get; private set; }

public string Name { get; private set; }

public MyTargetClass(MySourceClass source)
{
}
}

private class MySourceClass
{
public Guid Id { get; set; }

public string Name { get; set; }
}

private Dictionary<Guid, IEnumerable<ITargetClass>> ConvertItems(Dictionary<Guid, IEnumerable<MySourceClass>> source)
{
return source.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Select(v => new MyTargetClass(v)));
}
}

但是这不会编译,因为 ToDictionary 行会导致以下错误

Cannot implicitly convert type
'System.Collections.Generic.Dictionary<System.Guid,System.Collections.Generic.IEnumerable<TestAdaptor.TestAdaptor.MyTargetClass>>'
to
'System.Collections.Generic.Dictionary<System.Guid,System.Collections.Generic.IEnumerable<TestAdaptor.TestAdaptor.ITargetClass>>' ...\TestAdaptor.cs 38 20

现在很明显 MyTargetClass 实现了 ITargetClass,但编译器没有选择它。

现在我正在显式转换 (ITargetClass)new MyTargetClass(v)

但为什么首先会发生这种情况,有没有更好的方法来解决这个问题?

最佳答案

编译器不会自动转换IEnumberable<X>IEnumerable<Y>即使X : Y因为IDictionary不是 covariant .此处讨论了这样做的基本原理:IDictionary<,> contravariance?IDictionary<TKey, TValue> in .NET 4 not covariant

至于绕过它,就像你提到的,你必须施法:

使用 Cast 扩展方法:

 kvp => kvp.Value.Select(v => new MyTargetClass(v)).Cast<ITargetClass>()

显式转换:

 kvp => kvp.Value.Select(v => (ITargetClass) new MyTargetClass(v))

更新:

由于 IEnumerable 之间的混淆,只是对此进行扩展和 IDictionary . IEnumerable 协变的。 IDictionary 不是

这很好:

 IEnumerable<ITargetClass> list = new List<MyTargetClass>();

这不是:

 IDictionary<object, IEnumerable<ITargetClass>> dict = 
new Dictionary<object, List<MyTargetClass>>();

IDictionary继承自 IEnumerable<KeyValuePair<TKey, TValue>> .问题是 KeyValuePair这不是协变的,这使得 IDictionary不协变。

关于c# - Linq ToDictionary 不会将类隐式转换为接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25136049/

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