繁体   English   中英

C#如何转换泛型

[英]c# How to cast a generic type

我想强制转换字典,以便将值强制转换为由原始类型实现的接口;

首先:

public class DataRef<T> : IRef
{
      public int ID;
      public static Dictionary<int, T> LookUp = new Dictionary<int, T>();
}

public class Terrain : IThing
{
    ///IThing
    public ImageRef DefaultImageRef { get { return defaultImageRef; } }
    public string Name { get { return name; } }
    public string name = "unamed Terrain";

    //Other Stuff
    public TerrainType TerrainType = TerrainType.Floor;
    public ImageRef defaultImageRef = new ImageRef(typeof(Terrain));
    public ImageRef alternateImageRef = new ImageRef(typeof(Terrain));
    public int imageRef2;
}

public interface IThing
{
    ImageRef DefaultImageRef { get; }
    string Name { get; }
}

该表达式不能编译:

(Dictionary<int,IThing>)DataRef<Terrain>.LookUp

错误:

错误15无法将类型'System.Collections.Generic.Dictionary <int,MO1.Definitions.Terrain>'转换为'System.Collections.Generic.Dictionary <int,MO1.Definitions.IThing>'C:\\ Projects \\ MO1RPG \\ VSsolution \\ Editor \\ Main.cs 28 72编辑器

我想强制转换字典,因为我想将其用作强制转换为“字典”的参数。有什么办法吗?

使用铸造是不可能的。 您必须创建一个新词典。

首先,这是不直观的,因为您可以执行以下操作:

Terrain dataRef = new Terrain();
IThing thing = (IThing)dataRef;

但是您不能这样做:

Dictionary<string, Terrain> dict = new Dictionary<string, Terrain>();
Dictionary<string, IThing> castDict = (Dictionary<string, IThing>)dict;

此处说明了差异: https : //msdn.microsoft.com/zh-cn/library/dd799517(v=vs.110).aspx

简单来说,字典不是只读的,因此不能提供执行转换所需的某些保证。 例如

Dictionary<string, Terrain> dict = new Dictionary<string, Terrain>();
Dictionary<string, IThing> castDict = (Dictionary<string, IThing>)dict;
castDict.Add("Rob", new DifferentThing()); // DifferentThing implements IThing

我们在这里所做的是在希望Terrain的字典中添加了DifferentThing ,这是一个很大的禁忌。 为什么大禁忌?

因为如果有人这样做,该怎么办: Terrain terr = dict["Rob"]; 现在我们正在尝试将DifferentThing存储到Terrain

您需要记住的是,投射对象不是 (当然有例外) 不是创建新对象,而是改变我们从外部查看它的方式。

为了从Dictionary<string, Terrain>获得Dictionary<string, IThing> ,您需要创建一个定义为Dictionary<string, IThing>词典Dictionary<string, IThing>并用原始词典填充它。

请参阅BrianMains的答案以了解执行此操作的方法

您可以尝试使用Cast Linq方法,但是可能需要改用通用的ToDictionary(k => k.Key, v => (IThing)v.Value); 选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM