【发布时间】:2012-08-30 22:54:52
【问题描述】:
我遇到了一个有趣的情况,有些事情正在发挥作用,但有些事情却没有,我不知道为什么。下面是近似我的情况的代码。我在存储库中有一个静态的,它采用由对象的基本类型实现的泛型类型。然后,我有两个基于该泛型类型的派生类。派生类的第一级填充了基类型的泛型参数并且工作正常,但是从填充泛型参数的类派生的任何类都不能代替它派生的基类。
public class Vehicle<TVehicleType, TStorage>
{
}
public class Car : Vehicle<Car, ParkingLot>
{
}
public class PickupTruck : Car
{
}
public class Dealership <TDrivableVehicle>
{
public static TDrivableVehicle GetVehicle<TVehicleType, TStorage>(TStorage lot)
where TDrivableVehicle : Vehicle<TVehicleType, TStorage>, new()
{
}
}
public class CarDealership : Dealership<Car>
{
public static Car GetDrivableVehicle(aCarParkingLot)
{
return Dealership.GetDrivableVehicle<Car, CarParkingLot>(aCarParkingLot); <-- Works fine
}
}
public class PickupTruckDealership : CarDealership
{
public static PickupTruck GetDrivableVehicle(aCarParkingLot)
{
return Dealership.GetDrivableVehicle<PickupTruck, CarParkingLot>(aCarParkingLot); <-- fails
}
}
就 PickupTruck 理解其通用基础而言,某些方面似乎可以正常工作,但扩展(此处未显示)和将类型传递给类型参数特别不能(GetDrivableVehicle 调用)。我的猜测是扩展方法与类型参数问题有关,因为它需要弄清楚类型。
任何想法为什么这不起作用和/或可以做些什么来解决它?
【问题讨论】:
-
很抱歉,我在您的代码中没有看到任何扩展方法。另外,究竟是哪一部分给了你错误?
-
我想我理解您遇到的一些问题 - 但您可能希望确保上面的代码仅编译您突出显示的错误。当我粘贴这段代码时,有一些基本错误;尤其是最后两个静态方法中的错误参数说明符;以及您尝试在不传递类型参数的情况下使用
Dealership的事实。此外 - 您不能将类泛型参数的where约束放在其中的方法上 - 它必须继续类型本身。我知道这是一个例子——但它仍然需要“工作” -
是的,对不起,我意识到这是一个不完美的例子,但我主要是在寻找更多关于它为什么不工作或什么可能是更好的模式的信息,所以我认为鉴于一个完整的可编译示例的复杂性,它至少可以理解这一点。我认为其他一些 cmets 确实如此,但很抱歉这让它变得更加困难。
-
@Andre - 是的,对不起,我忘了加入扩展方法,但问题也出现在指定的行上。我相信他们因为同样的原因失败了,并且没有一个明确的方法来给出扩展方法的全部范围。我将更改原始问题以删除扩展方法参考
标签: c# generics inheritance