我将尝试创建一个方法,它基于给定的泛型类型从数据库返回数据。
接口:(此定义可以编译)
要像这样使用:
问题:
为什么这个接口可以编译通过,但方法却不行?
我原以为两者都能正常工作或两者都会失败。我假设编译器可以从TOrderPosition的类型中推断出TOrder和TArticle的类型,因为它定义了文章和订单的具体类型。
我想知道为什么会发生这种情况,以及是否以及如何在不必显式指定所有类型的情况下解决该问题。
public interface IOrderPosition<TOrder, TArticle, TOrderPosition>
where TOrder : IOrder
where TArtile : IArticle
where TOrderPosition : IOrderPosition<TOrder, TArticle, TOrderPosition>
{
long? id { get; set; }
TOrder order { get; set; }
TArtile article { get; set; }
List<TOrderPosition> subPositions { get; set; }
}
一种可能的具体实现:(此定义可编译)
public class OrderPosition : IOrderPosition<Order, Article, OrderPosition>
{
public long? id { get; set; }
public Order order { get; set; }
public Article article { get; set; }
public List<OrderPosition> subPositions { get; set; }
}
尝试根据接口编写通用方法:(此定义无法编译)
public List<TOrderPosition> GetOrderPositionOfOrder<TOrderPosition>(long? id)
where TOrder : IOrder
where TArticle : IArticle
where TOrderPosition : IOrderPosition<TOrder, TArticle, TOrderPosition>
{
..
}
Errors:
'DataSourceOrder.GetOrderPositionOfOrder<TOrderPosition>()' does not define type parameter 'TOrder'
'DataSourceOrder.GetOrderPositionOfOrder<TOrderPosition>()' does not define type parameter 'TArticle'
The type or namespace name 'TOrder' could not be found (are you missing a using directive or an assembly reference?)
The type or namespace name 'TArticle' could not be found (are you missing a using directive or an assembly reference?)
要像这样使用:
List<OrderPosition> positions = GetOrderPositionOfOrder<OrderPosition>(5);
List<TransferOrderPosition> transferPositions = GetOrderPositionOfOrder<TransferOrderPosition>(5);
问题:
为什么这个接口可以编译通过,但方法却不行?
我原以为两者都能正常工作或两者都会失败。我假设编译器可以从TOrderPosition的类型中推断出TOrder和TArticle的类型,因为它定义了文章和订单的具体类型。
我想知道为什么会发生这种情况,以及是否以及如何在不必显式指定所有类型的情况下解决该问题。
OrderPosition
的类型中推断出缺失的类型,因为我想避免列出所有类型(实际上有多于那三个)。 - @Evk - Holly