データベースからジェネリックタイプに基づいてデータを返すメソッドを作成しようとしています。ネストされたジェネリックタイプのジェネリックメソッドを制限する方法
インターフェース:(この定義はコンパイル)
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);
質問:
なぜインタフェース用にコンパイルされますが、メソッド用にコンパイルされませんか?
私はどちらもうまく動作すると思われますが、どちらも失敗すると思います。コンパイルは、TOrderとTArticleの型を、TOrderPositionに与えられた型から推論することができ、これは記事と順序の両方の具体的な型を定義すると仮定しました。
なぜこのようなことが起こり、すべてのタイプを明示的に指定しなくても問題を解決できるかどうかを知りたいと思います。
しかし、あなたのメソッドにはTOrderとTArticleのジェネリックパラメータを定義しません。それ以外の場合はコンパイルします。そしてクラスのために、3つすべて(TOrder、TArtile、TOrderPosition) – Evk
@Evkを指定すると、これはうまくいきませんでした。私は、コンパイラが何らかの理由で欠落している型を '私はすべての型をリストすることを避けたいので、OrderPosition'(実際には3以上のものがあります) – Holly