【发布时间】:2016-12-17 16:00:23
【问题描述】:
我正在开发一个泛型类和相关的泛型方法。我相信我要描述的问题与协方差有关,但我无法弄清楚编译器要我做什么。
编辑:添加显示我如何填充字典的代码
有抽象基类NetworkNode。具体类 PowerNetworkNode 继承自它。现在我有一个无法编译的函数。我应该进行哪些更改才能使其编译并具有所需的功能?
在 abc NetworkNode 中,我们有
public abstract IDictionary<uint, NetworkNode>
hydrateNodes<NetworkNode>(string nodesTableName);
在具体类 PowerNetworkNode 中,它被覆盖
public override IDictionary<uint, NetworkNode>
hydrateNodes<NetworkNode>(string nodesTableName)
{
IDictionary<uint, PowerNetworkNode> returnDict =
new Dictionary<uint, PowerNetworkNode>();
// code elided
returnDict[Convert.ToUInt32(oid)] =
new PowerNetworkNode(oid, minPow, maxPow, edges, fuelType, ngID);
// NetworkNode doesn't have all the fields that PowerNetworkNode has.
return returnDict;
}
编译器错误信息是:
Error CS0266 Cannot implicitly convert type
'System.Collections.Generic.IDictionary<uint,
CImodeller.Model.NetworkElements.PowerNetworkNode>' to
'System.Collections.Generic.IDictionary<uint, NetworkNode>'.
An explicit conversion exists (are you missing a cast?)
当我把代码改成这样时:
public override IDictionary<uint, NetworkNode>
hydrateNodes<NetworkNode>(string nodesTableName)
{
IDictionary<uint, NetworkNode> returnDict =
new Dictionary<uint, PowerNetworkNode>();
// code elided
return returnDict;
}
编译器指出,“新字典”行现在使用 NetworkNode 而不是 PowerNetworkNode 创建一个
Error CS0266 Cannot implicitly convert type
'System.Collections.Generic.Dictionary<uint,
CImodeller.Model.NetworkElements.PowerNetworkNode>' to
'System.Collections.Generic.IDictionary<uint, NetworkNode>'.
An explicit conversion exists (are you missing a cast?)
我明白这意味着什么,但我不知道我应该改变什么才能让它工作。
【问题讨论】:
-
IDictionary<TKey, TValue>不是变体,也不是TKey,也不是TValue。 -
PetSerAI 答案很多。 (我不是在讽刺。)是否有任何定义为
的东西,我可以协变地使用它也是一个键值对? -
Ant P,这会引发另一种错误。我已经更新了我的问题以涵盖发生的情况。
-
Ant P,这仍然只是将错误移动到它说的地方, returnDict[Convert.ToUInt32(oid)] = new PowerNetworkNode(oid, minPow, maxPow, edges,fuelType, ngID);现在它说错误 CS0029 无法将类型“CImodeller.Model.NetworkElements.PowerNetworkNode”隐式转换为“NetworkNode”
-
NetworkNode应该是一个类吗?目前它是hydrateNodes的通用参数。你应该如何填充字典?
标签: c# generics covariance