ITransactionConsumer
で定義された2番目のメソッドがコンパイルされない理由は、次のインターフェイスではわかりません。コンパイラはITransaction<IUser>
に変換できないと文句を言いますが、TUser
はとIUser
です。C#ジェネリックス - ジェネリックインターフェイス変換エラー
public interface ITransactionConsumer
{
//fine
PaymentSession<TTransaction> ConsumeTransaction<TTransaction>(TTransaction transaction)
where TTransaction : ITransaction<IUser>;
//compile error - TTransaction is not convertable to ITransaction<IUser>
PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction)
where TTransaction : ITransaction<TUser> where TUser : IUser;
}
public class PaymentSession<TTransaction>
where TTransaction : ITransaction<IUser>
{
}
public interface ITransaction<out TUser>
where TUser : IUser
{
TUser User { get; }
string Id { get; }
}
public interface IUser
{
string Name { get; }
}
「TUser」にクラス制約を追加する必要があるようです。つまり、「where TUser class、IUser」です。 – Lee
は、私は別のコンパイルエラーを取得:重大\tコード\t説明\tプロジェクト\tファイル\tライン\t抑制状態 エラー\t CS0314 \t型「TTransaction」がジェネリック型またはメソッド「PaymentSession <タイプパラメータ「TTransaction」として使用することはできませんTTransaction> 'を選択します。 「TTransaction」から「ITransaction」へのボクシング変換または型パラメータ変換はありません。 –