C# 如何通过;字典<;x、 类别>&引用;as字典<;x、 界面>&引用;?

C# 如何通过;字典<;x、 类别>&引用;as字典<;x、 界面>&引用;?,c#,generics,interface,C#,Generics,Interface,C#和Stackoverflow都是新手……请随时指出是否应该以其他方式或其他方式询问此问题 鉴于: public interface IPoint {...} public struct DeliveryPoint : IPoint {...} 以及生成包含大量传递点的词典的代码: ... Dictionary<uint,DeliveryPoint> dict = new Dictionary<uint,DeliveryPoint>(); ... 我找到的唯一解决方

C#和Stackoverflow都是新手……请随时指出是否应该以其他方式或其他方式询问此问题

鉴于:

public interface IPoint {...}
public struct DeliveryPoint : IPoint {...}
以及生成包含大量传递点的词典的代码:

...
Dictionary<uint,DeliveryPoint> dict = new Dictionary<uint,DeliveryPoint>();
...
我找到的唯一解决方案是创建一个新列表并复制所有要点,这似乎违背了最初实现接口的全部目的


有更好的方法吗?

使方法泛化于类型实现接口的值之上

public void DoSomething<TPoint>(IDictionary<uint, TPoint> dict) where TPoint : IPoint
{
    // do stuff
}
public void DoSomething(IDictionary dict),其中TPoint:IPoint
{
//做事
}

问题在于IDictionary不是协变的,它是不变的。最简单的更改是将其设置为
new Dictionary()
。旁注:“创建一个新列表并复制所有点”对于传递
字典
…@user2864740,这听起来像是一个奇怪的解决方案。请注意,它需要对所有值进行装箱。@AlexeiLevenkov说得对。我没有注意到混凝土类型是一个结构。
doSomething( dict );
public void DoSomething<TPoint>(IDictionary<uint, TPoint> dict) where TPoint : IPoint
{
    // do stuff
}