有一个代码,其中有这个实现:
using System;
using System.Collections.Generic;
namespace ConsoleApp{
public interface IModel { }
public class Model : IModel { }
public interface IDataBuilder<T> where T : IModel
{
T Build();
}
public interface IActionBuilder<T> where T : IModel
{
object BuildAction(T model);
}
public interface ISet<T> where T : IModel
{
IDataBuilder<T> DataBuilder { get; }
IActionBuilder<T> ActionBuilder { get;}
}
public class Builder
{
private List<ISet<IModel>> _dataBuilders;
public void AddSet(ISet<IModel> _dataBuilder)
{
_dataBuilders.Add(_dataBuilder);
}
}
public class MySet : ISet<Model>
{
public IDataBuilder<Model> DataBuilder => throw;
public IActionBuilder<Model> ActionBuilder => throw;
}
public class Program
{
static void Main(string[] args)
{
var builder = new Builder();
builder.AddSet( new MySet() );
}
}
}
并在行
builder.AddSet( new MySet() );
我收到此错误:
Program.cs(56,29):[CS1503]参数1:无法转换
'ConsoleApp.MySet'
至'ConsoleApp.ISet<ConsoleApp.IModel>'
当然,我可以直接演员:
var builder = new Builder();
builder.AddSet( (ISet<IModel>)new MySet() );
但在我的情况下,这不是一个选项,我需要它在没有这样的演员的情况下在架构上进行解决。
不幸的是,使用协方差和不变性并没有帮助。