C# 当泛型类型是类型的父级时,无法将类型隐式转换为泛型类型
我试图通过构建我称之为WorldObjects的对象来构建一个统一的游戏。WorldObjects是通过管理器(WorldObjectDataManager)管理的数据类(WorldObjectData)生成的。需要修复的部分是生成WorldObjects的过程。长话短说,我必须向WorldObject生成器传递两个通用参数:第一个是WorldObject的类型,第二个是数据类的类型(以便脚本能够获取正确的WorldObjectDataManager) 错误CS0029无法隐式转换类型 'Sandbox.GUI.Sandbox.BuildButton.buildMenuntry' 到“Sandbox.GUI.Sandbox.BuildButton.buildMenuntery”程序集CSharp C:\Unity Projects\80 Sandbox\Assets\Scripts\GUI\Sandbox\BuildButtons\BuildButtonsChildren\BuildControl.cs 16处于活动状态 这是我在尝试编译行控制台时遇到的错误。GetEntry()C# 当泛型类型是类型的父级时,无法将类型隐式转换为泛型类型,c#,oop,unity3d,generics,delegates,C#,Oop,Unity3d,Generics,Delegates,我试图通过构建我称之为WorldObjects的对象来构建一个统一的游戏。WorldObjects是通过管理器(WorldObjectDataManager)管理的数据类(WorldObjectData)生成的。需要修复的部分是生成WorldObjects的过程。长话短说,我必须向WorldObject生成器传递两个通用参数:第一个是WorldObject的类型,第二个是数据类的类型(以便脚本能够获取正确的WorldObjectDataManager) 错误CS0029无法隐式转换类型 'San
使用Sandbox.Selectables.Entities.jobInteractiables.WorldObjects;
使用Sandbox.Selectables.Entities.JobInteractiables.WorldObjects.Consoles;
命名空间Sandbox.GUI.Sandbox.BuildButton//用于通过按钮生成WorldObjects
{
///
///用于控制建筑物的BuildButton(例如:控制台)
///
公共类BuildControl:CreateBuildButtonNew其中T:WorldObject其中G:WorldObjectData
{
受保护的重写BuildMenumentry[]GetBuildMenumentries()
{
返回新的BuildingEntry[]
{
Console.GetEntry()
};
}
}
}
Console.GetEntry的编码如下:
public static BuildMenuEntry<Console, ConsoleData> GetEntry()
{
return new BuildMenuEntry<Console, ConsoleData> // Console and ConsoleData inherit from WorldObject and WorldObjectData respectively
{
entryName = UIStringID, // string
entrysMaterials = new WorldObjectMaterial[] { WorldObjectMaterial.Steel }, // WorldObjectMaterial is an enum
associatedFunction = InitializeByStatic<Console, ConsoleData> // the spawning function
};
}
publicstaticbuildmenuentry GetEntry()
{
返回新的BuildMenuEntry//Console和ConsoleData分别从WorldObject和WorldObjectData继承
{
entryName=UIStringID,//字符串
entrysMaterials=new WorldObjectMaterials[]{WorldObjectMaterial.Steel},//WorldObjectMaterial是一个枚举
associatedFunction=InitializeByStatic//生成函数
};
}
最后,建筑业:
using Sandbox.Selectables.Entities.JobInteractables.WorldObjects;
namespace Sandbox.GUI.Sandbox.BuildButton
{
public struct BuildMenuEntry<T, G> where T : WorldObject where G : WorldObjectData
{
public string entryName;
public WorldObjectMaterial[] entrysMaterials;
public SpawnWorldObject<T, G> associatedFunction;
}
}
使用Sandbox.Selectables.Entities.jobInteractiables.WorldObjects;
命名空间Sandbox.GUI.Sandbox.BuildButton
{
public struct BuildMenuEntry其中T:WorldObject其中G:WorldObjectData
{
公共字符串入口名;
公共WorldObjectMaterial[]入口材料;
公共对象关联函数;
}
}
我不知道这里有什么问题,因为T和G分别被约束为WorldObject和WorldObjectData,并且Console.GetEntry返回一个类,其泛型类型继承自WorldObject和WorldObjectData
非常感谢您的帮助 问题是您试图将
BuildMenuEntry
放在BuildMenuEntry
的数组中
这里的情况将有助于理解这个问题 您的类
BuildControl
是泛型的。让我们想象一下,我们将它用作构建控件。在这种情况下,您的方法可以如下所示:
protectedoverride BuildMenuEntry[]GetBuildMenuEntries()
{
返回新的BuildingEntry[]
{
Console.GetEntry()
};
}
现在我们可以看到Consol.GetEntry
返回一个BuildMenuEntry
。您不能将BuildMenuEntry
放入BuildMenuEntry
数组中,因为Console
不是Car
,ConsoleData
不是CarData
你放在BuildMenuEntry
数组中的必须是BuildMenuEntry
项,其中T
和G
仍然是泛型,而不是具体的东西。我相信这是因为GetEntry
需要比BuildControl
需要更多的派生类型。如果将BuildControl
约束到Console
和ConsoleData
,错误会消失吗?“当泛型类型是类型的父类型时,无法隐式将类型转换为泛型类型”--前提有缺陷。您认为所涉及的泛型类型具有父(基)/子(派生)关系,而实际上它们没有。只有类型参数可以。但是,如果类型参数是base&child,则泛型类型本身不会成为base&child。请参阅复制。@RufusL是的,一旦我将BuildControl约束到Console和ConsoleData,错误就会消失
using Sandbox.Selectables.Entities.JobInteractables.WorldObjects;
namespace Sandbox.GUI.Sandbox.BuildButton
{
public struct BuildMenuEntry<T, G> where T : WorldObject where G : WorldObjectData
{
public string entryName;
public WorldObjectMaterial[] entrysMaterials;
public SpawnWorldObject<T, G> associatedFunction;
}
}