gpt4 book ai didi

c# - 为什么泛型方法不能将具体(派生)类转换为其父类

转载 作者:行者123 更新时间:2023-11-30 21:30:58 30 4
gpt4 key购买 nike

我遇到了我想要的情况 Deal class要注意它DealDetail type反之亦然,我想 DealDetail注意Deal type .将来我想有很多 Deal 的后代和 DealDetails

我尝试使用泛型来实现它,但它不想编译。编译器给出错误:无法将类型“Program.ConcreateDeal”隐式转换为“TDeal”

public static void Main()
{
Console.WriteLine("Hello World");

var deal = GetDeal<ConcreateDeal,ConcreateDealInfo>();
}

public static TDeal GetDeal<TDeal, TDealInfo>()
where TDeal : DealBase<TDeal, TDealInfo>
where TDealInfo : DealInfoBase<TDeal, TDealInfo>
{
return new ConcreateDeal();
}

public class DealBase<TDeal, TDealInfo>
where TDeal : DealBase<TDeal, TDealInfo>
where TDealInfo : DealInfoBase<TDeal, TDealInfo>
{
public TDealInfo DealInfo {get; set;}
}

public class ConcreateDeal : DealBase<ConcreateDeal, ConcreateDealInfo> {}

public class DealInfoBase<TDeal, TDealInfo>
where TDeal : DealBase<TDeal, TDealInfo>
where TDealInfo : DealInfoBase<TDeal, TDealInfo>

{
public TDeal Deal {get; set;}
}

public class ConcreateDealInfo : DealInfoBase<ConcreateDeal, ConcreateDealInfo> { }

我预计在方法 GetDeal<ConcreateDeal,ConcreateDealInfo>() 中输入 ConcreateDeal将被类型转换到基地 Deal type隐含地,通过继承,但事实并非如此。我哪里错了?

dotnetfiddle:https://dotnetfiddle.net/sjtxTC

最佳答案

编译错误在这里:

public static TDeal GetDeal<TDeal, TDealInfo>()
where TDeal : DealBase<TDeal, TDealInfo>
where TDealInfo : DealInfoBase<TDeal, TDealInfo>
{
return new ConcreateDeal(); // <== compiler error
}

您提供的通用参数指定返回类型必须是 DealBase<TDeal, TDealInfo> .您可以编写任意数量的继承自 DealBase 的类和 DealInfoBase , 然后可以使用不对应于 ConcreteDeal 的通用参数调用该方法.

由于泛型参数的数量太多,所以有点难看。这是一个更简单的版本,具有较少的通用参数用于说明。它更简单,但都是一样的。

public class Dog : Animal { }
public class Cat : Animal { }

public class Animal
{
public static TAnimal GetAnimal<TAnimal>()
{
return new Dog();
}
}

由于完全相同的原因,这不会编译。

通用参数表示该方法将返回 TAnimal .所以如果你打电话

var cat = Animal.GetAnimal<Cat>();

返回类型必须Cat .但按原样该方法将返回 Dog .它没有意义,所以编译器会阻止它。

关于c# - 为什么泛型方法不能将具体(派生)类转换为其父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53876758/

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