C# c如何强制转换泛型类型

C# c如何强制转换泛型类型,c#,generics,casting,C#,Generics,Casting,我想强制转换一个字典,以便将值强制转换为由原始类型实现的接口 首先: 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

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

首先:

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' 到 'System.Collections.Generic.Dictionary'C:\Projects\MO1RPG\VSsolution\Editor\Main.cs 28 72 Editor


我想强制转换字典,因为我想将它用作强制转换为字典的参数有什么方法吗?

您可以尝试使用强制转换Linq方法,但您可能需要改用泛型ToDictionaryk=>k.Key,v=>IThingv.Value;选项。

您可以尝试使用Cast-Linq方法,但可能需要使用泛型ToDictionaryk=>k.Key,v=>IThingv.Value;选项。

这在铸造中是不可能的。您必须创建一个新词典

一开始它是不直观的,因为您可以这样做:

Terrain dataRef = new Terrain();
IThing thing = (IThing)dataRef;
但你不允许这样做:

Dictionary<string, Terrain> dict = new Dictionary<string, Terrain>();
Dictionary<string, IThing> castDict = (Dictionary<string, IThing>)dict;
区别在这里解释如下:

不过,简单地说,字典不是只读的,因此无法提供执行强制转换所需的某些保证。比如说

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 terr=dict[Rob]; 现在我们正在尝试将不同的东西存储到地形中

您需要记住的是,强制转换对象并不是例外,当然,创建一个新对象,而是改变我们对它的外部视图

为了从字典中获取字典,您需要创建一个定义为Dictionary的新字典,并用原始字典填充它


请参见BrianMains的答案,了解如何进行此操作

这在铸造中是不可能的。您必须创建一个新词典

一开始它是不直观的,因为您可以这样做:

Terrain dataRef = new Terrain();
IThing thing = (IThing)dataRef;
但你不允许这样做:

Dictionary<string, Terrain> dict = new Dictionary<string, Terrain>();
Dictionary<string, IThing> castDict = (Dictionary<string, IThing>)dict;
区别在这里解释如下:

不过,简单地说,字典不是只读的,因此无法提供执行强制转换所需的某些保证。比如说

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 terr=dict[Rob]; 现在我们正在尝试将不同的东西存储到地形中

您需要记住的是,强制转换对象并不是例外,当然,创建一个新对象,而是改变我们对它的外部视图

为了从字典中获取字典,您需要创建一个定义为Dictionary的新字典,并用原始字典填充它

请参见BrianMains的答案,了解如何做到这一点