考虑到以下接口,我不明白为什么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; }
}
答案 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的类型更具限制性强>