C#泛型 - 通用接口转换错误

时间:2017-09-26 13:38:21

标签: c# generics

考虑到以下接口,我不明白为什么ITransactionConsumer上定义的第二种方法无法编译。编译器抱怨它无法转换为ITransaction<IUser> - 但是TUser IUser的通用约束。?

    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; }
    }

1 个答案:

答案 0 :(得分:1)

你可以用这个替换你的违规行吗?

  PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction)
     where TTransaction : ITransaction<TUser>, ITransaction<IUser> where TUser : IUser;

修改 由于这种方法有效,最正确的方法(我希望您对代码的意图)将使用您在第一个 ConsumeTransaction 声明中使用的语法:

  PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction)
     where TTransaction : ITransaction<IUser>;

您犯的错误涉及 PaymentSession 返回值。您的 PaymentSession 类表示它可以接受的类型参数的约束。您将该类型参数定义为 TTransaction ,然后指定 TTransaction 必须实现具有 IUser 的接口 ITransaction 类型参数。但是您尝试声明一个函数 ConsumeTransactionWithTUser ,它返回一种 PaymentSession ,其中 TTransaction 是一种实现 IUser 。实现接口的类型与接口本身不同! PaymentSession 的类型必须是 IUser - 这是您指定的约束,这就是编译器抱怨的原因: ITransaction&lt; TUser&gt; ITransaction&lt;不一样IUser&gt;

结束: PaymentSession 类中的约束要求通用类型的类型为 ITransaction&lt; IUser&gt; - 比说 PaymentSession 要求通用类型为通用类型 ITransaction 更接受实现 IUser的类型更具限制性