【发布时间】:2020-06-15 08:37:34
【问题描述】:
对于这个简单的示例,我无法绕过 C# 协方差,这是我定义模型的方式:
interface IResponse { }
interface ICommand<out TResponse> where TResponse : IResponse { }
class Response : IResponse { }
class Command<TResponse> : ICommand<TResponse> where TResponse : IResponse { }
所以我可以这样使用它
IResponse rsp = new Response(); //Works, obviously!
ICommand<IResponse> cmdi = new Command<Response>(); //Works, but I don't need this
Command<IResponse> cmd = new Command<Response>(); //Compile time error! :(
Command<TResponse> 中的Command 甚至没有TResponse 类型的任何属性或方法。如何更改它才能正常工作?
【问题讨论】:
-
类总是不变的。只有接口可以变体。为什么不需要
ICommand<IResponse> cmdi = new Command<Response>();?您需要Command提供的哪些独家产品,而您无法从ICommand获得? -
我需要持久化命令,它们本质上是 POCO 类,如果我想查询具有
List<ICommand<IResponse>>类型属性的任何内容,Odata core就会中断
标签: c# generics covariance contravariance mediatr