没有重载的匹配委托func <t,t =“”>

时间:2017-04-25 13:07:14

标签: c#

我对代表有一些问题

我的课程方案:

public interface IWorker<T> where T : IModel
{     
   T Do(T model);
   T ReadyToWork(T model);
}

public abstract class Workers<T> : IWorker<T> where T : IModel
{
   public abstract T Do(T model);
   public abstract T ReadyToWork(T model);
}

班上班! FirstModel : IModel

public class FirstWorker : Workers<ModelFirst>
{
   public override ModelFirst Do(ModelFirst model)
   {
      return new ModelUserFirst();
   }
   public override ModelFirst ReadyToWork(ModelFirst model)
   {
      throw new NotImplementedException();
   }
}

我可以创建许多工作特殊类,并且为了使用它们,我创建了一个访问点:

public class WorkPoint<T> where T : IModel
{
    public static Func<T, T> Do { get; set; }
    public static Func<T, T> ReadyToWork{ get; set; }

    public WorkPoint(ModelFirst mod)
    {
       Do = FirstWorker.Instance().Do;
       ReadyToWork= FirstWorker.Instance().ReadyToWork;
    }
}
好的,还有问题。时刻分配DoReadyToWork我发现错误 错误CS0123没有过载&#39;做&#39;匹配委托&#39; Func&#39; 怎么了?

1 个答案:

答案 0 :(得分:0)

这不是最优雅的解决方案,但这有效:

Main.iniciaServico()

由于创建了额外的类,这将增加一些开销,但它应该作为注释中指出的协方差问题的解决方法。

这样你就可以做到:

public class WorkPoint<T> where T : IModel
{
    public Func<T, T> Do { get; }
    public Func<T, T> ReadyToWork { get; }

    protected WorkPoint(Func<T, T> f, Func<T, T> r)
    {
        Do = f;
        ReadyToWork = r;
    }
}

// Create a simple class like this for evert worker type you need
public class FirstWorkPoint : WorkPoint<ModelFirst>
{
    private FirstWorkPoint() :
        base(FirstWorker.Instance().Do, FirstWorker.Instance().ReadyToWork)
    { }

    // Public method to get a new base instance
    public static WorkPoint<ModelFirst> New() => new FirstWorkPoint();
}

编辑:另外,如果你不需要那个基类WorkPoint<ModelFirst> point = FirstWorkPoint.New(); 类我会说你可以摆脱它并让实际的工人类直接从你的界面继承。毕竟,基类在上面的代码中没有提供任何附加功能。