将通用接口的实现分配给属性

Adr*_*tov 4 .net c# generics

我有一个界面

public interface IStrategy<T> where T : BaseModel
{
    T GetModel(Guid userId);
}
Run Code Online (Sandbox Code Playgroud)

和一个继承接口的具体类,指定它应该是一个 ConcreteModel

 public class ConcreteStrategy: IStrategy<ConcreteModel>
 {
     ConcreteModel GetModel(Guid userId) { ... }
 }
Run Code Online (Sandbox Code Playgroud)

现在在下面的方法中,我可以传递一个新的实例,ConcreteStrategy一切正常

 public class Manager
 {
    public TModel GetContentModel<TModel>(IStrategy<TModel> strategy, Guid userId)
        where TModel : ModelBase
    {
        return strategy.GetContentModel(userId);
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将它分配给这样的属性,我会收到错误

public class Strategies
{
    public static IStrategy<ModelBase> MyStrategy { get; set; }
}

Strategies.MyStrategy = new ConcreteStrategy();
Run Code Online (Sandbox Code Playgroud)

有没有办法在C#中实现这一目标?我希望能够创建一个工厂方法来封装使用策略的逻辑,并返回某种类型的策略类的实例(如ConcreteStrategy).

我得到的错误是:

无法隐式转换IStrategy<ModelBase>IStrategy<ConcreteModel>

Tho*_*que 5

您需要使您的界面协变:

public interface IStrategy<out T> where T : BaseModel
Run Code Online (Sandbox Code Playgroud)

请注意,它仅在T仅出现在界面的输出位置时才起作用(在您显示的代码中就是这种情况,但我不知道它是否是您的真实代码).