3

指定されたジェネリック型に基づいてデータベースからデータを返すメソッドを作成しようとしています。

インターフェイス: (この定義はコンパイルされます)

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>
{
  ..
}

エラー:

'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 の型を推測できると仮定しました。

なぜこれが起こるのか、すべてのタイプを明示的に指定しなくても問題を解決できるかどうか、またどのように解決できるかを知りたいです。

4

3 に答える 3