Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当泛型类型是类型的父级时,无法将类型隐式转换为泛型类型_C#_Oop_Unity3d_Generics_Delegates - Fatal编程技术网

C# 当泛型类型是类型的父级时,无法将类型隐式转换为泛型类型

C# 当泛型类型是类型的父级时,无法将类型隐式转换为泛型类型,c#,oop,unity3d,generics,delegates,C#,Oop,Unity3d,Generics,Delegates,我试图通过构建我称之为WorldObjects的对象来构建一个统一的游戏。WorldObjects是通过管理器(WorldObjectDataManager)管理的数据类(WorldObjectData)生成的。需要修复的部分是生成WorldObjects的过程。长话短说,我必须向WorldObject生成器传递两个通用参数:第一个是WorldObject的类型,第二个是数据类的类型(以便脚本能够获取正确的WorldObjectDataManager) 错误CS0029无法隐式转换类型 'San

我试图通过构建我称之为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()

使用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;
    }
}