gpt4 book ai didi

c# - 是否允许在另一个泛型方法中调用泛型方法?

转载 作者:行者123 更新时间:2023-11-30 14:06:23 25 4
gpt4 key购买 nike

我正在使用 Unity 制作 RTS 游戏。我的游戏中有很多类型的资源,例如树木、农场。每个资源都是一个游戏对象,并有自己的主脚本控制它。

例。我想收获一棵树,我称之为。

gameObject.GetComponent<Tree>().Harvest();

如果我想收获农场,我会调用相同的脚本,但将“Tree”更改为“Farm”,这很好,但代码会重复。所以我通过使用像这样的泛型方法来抽象它。

void Harvest<T>(){
gameObject.GetComponent<T>().Harvest();
}

但是 C# 编译器不允许我这样做。我想知道是否可以定义在内部使用泛型方法的泛型方法?如果没有,有没有办法像这样抽象我的代码?谢谢。

错误信息:

'T' does not contain a definition for 'Harvest' and no extension method 'Harvest' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]

最佳答案

问题是在...

void Harvest<T>(){
gameObject.GetComponent<T>().Harvest();
}

... C# 编译器不知道 T 是哪个具体类型。因此,它不知道将有一个方法 Harvest 可用,也不知道它的确切声明(它返回 voidbool 还是还有别的吗?它有可选参数吗?)。因为 C# 是一种强类型语言,所以必须在编译时知道这一点。这让您确信一切都会在运行时顺利进行。

解决方案是通过指定泛型类型约束来给编译器一个提示。为此,您必须声明一个接口(interface),并让具有 Harvest 方法的组件实现它。

public interface IHarvestable
{
void Harvest();
}

指定约束:

void Harvest<T>() where T : IHarvestable 
{
gameObject.GetComponent<T>().Harvest();
}

在您控制基类的其他情况下,您也可以在基类中声明所需的方法(可能是抽象的)并在 generic type constraint 中指定基类。而不是界面。

关于c# - 是否允许在另一个泛型方法中调用泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48035922/

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