Как привести тип к универсальному интерфейсу, который имеет другой интерфейс в качестве универсального параметра

Просто зайдите в php.ini, затем найдите short_open_tag= Off в short_open_tag= On

0
задан Bizhan 15 January 2019 в 22:37
поделиться

1 ответ

Приведение Child1Service к IBaseService<Child1VM> невозможно, если T в IBaseService<T> не определено как ковариант, который выполняется следующим образом: IBaseService<out T>

Теперь он выдаст вам эту ошибку:

CS1961 Недопустимая дисперсия: параметр типа 'TVM' должен быть противоположно допустимым для 'IBaseService.Method2 (TVM)'. «TVM» является ковариантным.

Поэтому вам придется изменить параметр Method2 с Child1VM на IBaseVM.

Это будет работать:

public interface IBaseService<out TVM> where TVM : IBaseVM
{
    TVM Method1();
    void Method2(IBaseVM param);
}

public interface IBaseVM
{
    int Id { get; set; }
    string Name { get; set; }
}

public class Child1VM : IBaseVM
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Child1Service : IBaseService<Child1VM>
{
    public Child1VM Method1() { return new Child1VM(); }
    public void Method2(IBaseVM param)
    {
        return; //body... }
    }
}

public class Driver
{
    public static void Main(string[] ars)
    {
        IBaseService<Child1VM> child1Service = new Child1Service();
        IBaseService<IBaseVM>[] services = new IBaseService<IBaseVM>[]
            {
                child1Service,
            };
    }
}
0
ответ дан Bizhan 15 January 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: