当泛型类型是类型的父类型时,无法将类型隐式转换为泛型类型
Cannot implicitly convert type to generic type when generic type is parent of type
我尝试通过构建我称为 WorldObjects 的对象来构建使用 Unity 制作的游戏。 WorldObjects 通过数据 class (WorldObjectData) 生成,该数据由管理器 (WorldObjectDataManager) 管理。需要修复的部分是生成 WorldObjects 的过程。长话短说,我必须将两个通用参数传递给 WorldObject 构建器:第一个是 WorldObject 的类型,第二个是数据 type class (以便脚本可以获取正确的 WorldObjectDataManager)。
Error CS0029 Cannot implicitly convert type
'Sandbox.GUI.Sandbox.BuildButton.BuildMenuEntry<Sandbox.Selectables.Entities.JobInteractables.WorldObjects.Consoles.Console,
Sandbox.Selectables.Entities.JobInteractables.WorldObjects.Consoles.ConsoleData>'
to 'Sandbox.GUI.Sandbox.BuildButton.BuildMenuEntry<T,
G>' Assembly-CSharp C:\Unity Projectss
Sandbox\Assets\Scripts\GUI\Sandbox\BuildButtons\BuildButtonsChildren\BuildControl.cs 16 Active
这是我在尝试编译行 Console.GetEntry():
时遇到的错误
using Sandbox.Selectables.Entities.JobInteractables.WorldObjects;
using Sandbox.Selectables.Entities.JobInteractables.WorldObjects.Consoles;
namespace Sandbox.GUI.Sandbox.BuildButton // Used to spawn WorldObjects via a button
{
/// <summary>
/// BuildButton used for control buildings (e.g.: consoles)
/// </summary>
public class BuildControl<T, G> : CreateBuildButtonNew<T, G> where T : WorldObject where G : WorldObjectData
{
protected override BuildMenuEntry<T, G>[] GetBuildMenuEntries()
{
return new BuildMenuEntry<T, G>[]
{
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
};
}
最后,BuildMenuEntry:
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;
}
}
我不知道这里有什么问题,因为 T 和 G 被限制为分别是 WorldObject 和 WorldObjectData,并且 Console.GetEntry returns 一个 class 其泛型类型继承自 WorldObject 和WorldObjectData.
非常感谢任何帮助!
问题是您试图将 BuildMenuEntry<Console, ConsoleData>
放入 BuildMenuEntry<T, G>
的数组中。
下面的情况有助于理解问题。
您的 class BuildControl<T, G>
是通用的。假设我们将它用作 BuildControl<Car, CarData>
。在这种情况下,您的方法可以这样阅读:
protected override BuildMenuEntry<Car, CarData>[] GetBuildMenuEntries()
{
return new BuildMenuEntry<Car, CarData>[]
{
Console.GetEntry()
};
}
现在我们可以看到 Consol.GetEntry
returns 一个 BuildMenuEntry<Console, ConsoleData>
。您不能将 BuildMenuEntry<Console, ConsoleData>
放在 BuildMenuEntry<Car, CarData>
的数组中,因为 Console
不是 Car
并且 ConsoleData
不是 CarData
。
你放在BuildMenuEntry<T, G>
数组中的必须是BuildMenuEntry<T, G>
项,其中T
和G
仍然是泛型,而不是具体的东西。
我尝试通过构建我称为 WorldObjects 的对象来构建使用 Unity 制作的游戏。 WorldObjects 通过数据 class (WorldObjectData) 生成,该数据由管理器 (WorldObjectDataManager) 管理。需要修复的部分是生成 WorldObjects 的过程。长话短说,我必须将两个通用参数传递给 WorldObject 构建器:第一个是 WorldObject 的类型,第二个是数据 type class (以便脚本可以获取正确的 WorldObjectDataManager)。
Error CS0029 Cannot implicitly convert type 'Sandbox.GUI.Sandbox.BuildButton.BuildMenuEntry<Sandbox.Selectables.Entities.JobInteractables.WorldObjects.Consoles.Console, Sandbox.Selectables.Entities.JobInteractables.WorldObjects.Consoles.ConsoleData>' to 'Sandbox.GUI.Sandbox.BuildButton.BuildMenuEntry<T, G>' Assembly-CSharp C:\Unity Projectss Sandbox\Assets\Scripts\GUI\Sandbox\BuildButtons\BuildButtonsChildren\BuildControl.cs 16 Active
这是我在尝试编译行 Console.GetEntry():
时遇到的错误using Sandbox.Selectables.Entities.JobInteractables.WorldObjects;
using Sandbox.Selectables.Entities.JobInteractables.WorldObjects.Consoles;
namespace Sandbox.GUI.Sandbox.BuildButton // Used to spawn WorldObjects via a button
{
/// <summary>
/// BuildButton used for control buildings (e.g.: consoles)
/// </summary>
public class BuildControl<T, G> : CreateBuildButtonNew<T, G> where T : WorldObject where G : WorldObjectData
{
protected override BuildMenuEntry<T, G>[] GetBuildMenuEntries()
{
return new BuildMenuEntry<T, G>[]
{
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
};
}
最后,BuildMenuEntry:
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;
}
}
我不知道这里有什么问题,因为 T 和 G 被限制为分别是 WorldObject 和 WorldObjectData,并且 Console.GetEntry returns 一个 class 其泛型类型继承自 WorldObject 和WorldObjectData.
非常感谢任何帮助!
问题是您试图将 BuildMenuEntry<Console, ConsoleData>
放入 BuildMenuEntry<T, G>
的数组中。
下面的情况有助于理解问题。
您的 class BuildControl<T, G>
是通用的。假设我们将它用作 BuildControl<Car, CarData>
。在这种情况下,您的方法可以这样阅读:
protected override BuildMenuEntry<Car, CarData>[] GetBuildMenuEntries()
{
return new BuildMenuEntry<Car, CarData>[]
{
Console.GetEntry()
};
}
现在我们可以看到 Consol.GetEntry
returns 一个 BuildMenuEntry<Console, ConsoleData>
。您不能将 BuildMenuEntry<Console, ConsoleData>
放在 BuildMenuEntry<Car, CarData>
的数组中,因为 Console
不是 Car
并且 ConsoleData
不是 CarData
。
你放在BuildMenuEntry<T, G>
数组中的必须是BuildMenuEntry<T, G>
项,其中T
和G
仍然是泛型,而不是具体的东西。