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

C#泛型-泛型接口转换错误,c#,generics,C#,Generics,考虑到以下接口,我不理解为什么在ITransactionConsumer上定义的第二个方法无法编译。编译器抱怨它不能转换为ITransaction——但有一个通用约束,即TUser是IUser public interface ITransactionConsumer { //fine PaymentSession<TTransaction> ConsumeTransaction<TTransaction>( TTransa

考虑到以下接口,我不理解为什么在
ITransactionConsumer
上定义的第二个方法无法编译。编译器抱怨它不能转换为
ITransaction
——但有一个通用约束,即
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; }
    }
公共接口ITransactionConsumer
{
//好的
PaymentSession消费事务(TTransaction事务)
其中t交易:i交易;
//编译错误-TTransaction不能转换为ITransaction
PaymentSession ConsumentTransactionWithTuser(交易)
式中t交易:i交易,其中t交易:i交易;
}
公开课发薪时段
其中t交易:ITransaction
{
}
公共接口ITransaction
图瑟:尤瑟
{
t用户{get;}
字符串Id{get;}
}
公共接口IUser
{
字符串名称{get;}
}

你能用这句话替换你的冒犯之词吗

  PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction)
     where TTransaction : ITransaction<TUser>, ITransaction<IUser> where TUser : IUser;
PaymentSession ConsumentTransactionWithTuser(TTransaction事务)
式中t交易:ITransaction,ITransaction,其中TUser:IUser;
编辑: 既然这样做有效,最正确的方法(对于我期望您在代码中使用的方法)是使用您在第一次ConsumeTransation声明中使用的语法:

  PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction)
     where TTransaction : ITransaction<IUser>;
PaymentSession ConsumentTransactionWithTuser(TTransaction事务)
其中t交易:i交易;
您犯的错误涉及您的支付会话返回值。您的PaymentSession类对它可以接受的类型参数表示约束。您将该类型参数定义为TTransaction,然后指定TTransaction必须实现一个接口ITransaction,该接口的类型参数为IUser。但是您随后尝试声明一个函数ConsumeTransactionWithTUser,该函数返回一种类型为PaymentSession,其中t Transaction是一种实现IUser的类型。实现接口的类型与接口本身不同PaymentSession的类型必须是IUser——这就是您指定的约束,这就是为什么编译器抱怨:ITransactionITransaction不同


总而言之:PaymentSession类中的约束要求泛型类型为ITransaction——这比说PaymentSession要求泛型类型为接受实现IUser

看起来您需要向
TUser
添加一个类约束,即
其中TUser class,IUser
。我得到一个不同的编译错误:严重性代码描述项目文件行抑制状态错误CS0314类型“TTransaction”不能用作泛型类型或方法“PaymentSession”中的类型参数“TTransaction”。没有从“TTransaction”到“ITransaction”的装箱转换或类型参数转换。这很有效!我仍然有点困惑为什么这是必要的,但这正是我需要的。谢谢,将被标记为正确。一个好的答案应该包括解释和代码。否则没人会学到任何东西。下一个课间休息时将提供解释。