和一个通用的 Add()具有 T 约束的方法作为GKComponent . 为什么我不能添加 GKComponentSystem 的实例?到我的名单?请参阅下面的代码片段: Lis-6ren">
gpt4 book ai didi

c# - 看到 "cannot convert expression to type while using a generic method"时我做错了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:56 27 4
gpt4 key购买 nike

我有一个 List<GKComponentSystem<GKComponent>>和一个通用的 Add<T>()具有 T 约束的方法作为GKComponent .

为什么我不能添加 GKComponentSystem<T> 的实例?到我的名单?请参阅下面的代码片段:

List<GKComponentSystem<GKComponent>> _systems = new List<GKComponentSystem<GKComponent>>();

public void AddSystem<T>(int position = -1) where T : GKComponent
{
var system = new GKComponentSystem<T>();
_systems.Add(system);
}

错误:

Argument #1 cannot convert GameplayKit.GKComponentSystem<T> expression to type GameplayKit.GKComponentSystem<GameplayKit.GKComponent>

_systems.Add(system) 行中.

我以为我了解 C#,但这是我很高兴拥有 StackOverflow 的情况之一 - 我到底哪里不明白?

systemGKComponentSystem<T>T必须是 GKComponent , 所以 systemGKComponentSystem<GKComponent>我应该可以将它添加到我的列表中。

这是 GKComponentSystem :

public class GKComponentSystem<T> : NSObject where T : GKComponent

它的 T也是一个GKComponent ...

这是关于逆变(我肯定需要学习更多的主题)吗?

最佳答案

这是一个更简单的例子:

 class Parent
{
}

class Child : Parent
{
}


class GenericClass<T>
{
}


Parent p;
p = new Child(); // A child inherits from Parent, so this is allowed.

GenericClass<Parent> gp;

gp = new GenericClass<Child>(); // Not allowed! GenericClass<Child> does not inherit from GenericClass<Parent>

在您的示例中,T继承自 GKComponent , 不会转化为 GKComponentSystem<T> 的规则可以转换为GKComponentSystem<GKComponent> .

现在让我们将其应用于列表。

List<Parent> l = new List<Parent>();
l.Add(new Child()); // A child can be converted to a Parent, this is OK


List<GenericClass<Parent>> gl = new List<GenericClass<Parent>>();

gl.Add(new GenericClass<Child>()); // A GenericClass<Child> does not convert to GenericClass<Parent>, so this is not allowed.

如果你真的想让它工作,你可以定义一个通用接口(interface)。这些允许您使用 out 指定通用参数如下:

 interface IGenericClass<out T>
{
}

class GenericClass<T> : IGenericClass<T>
{
}

IGenericClass<Child> gcChild = new GenericClass<Child>();
IGenericClass<Parent> gcParent = gcChild; // This is allowed!

var l = new List<IGenericClass<Parent>>();
l.Add(new GenericClass<Child>()); // Also allowed

因此,将其应用于您的示例:

 interface IGKComponentSystem<out T> 
{
}

class GKComponentSystem<T> : IGKComponentSystem
{
}

List<IGKComponentSystem<GKComponent>> _systems = new List<IGKComponentSystem<GKComponent>();

// Should work from there...
public void AddSystem<T>(int position = -1) where T : GKComponent
{
var system = new GKComponentSystem<T>();
_systems.Add(system);
}

关于c# - 看到 "cannot convert expression to type while using a generic method"时我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41707634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com