Наследование интерфейса и общие интерфейсы вызывают явное приведение - PullRequest
0 голосов
/ 17 июня 2011

У меня гораздо более сложная проблема, но я свел ее к следующему простому примеру:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            IFactory<IProduct> factory = new Factory();
        }
    }

    class Factory : IFactory<Product>
    {

    }

    class Product : IProduct
    {

    }

    interface IFactory<T> where T : IProduct
    {

    }

    interface IProduct
    {

    }
}

Все хорошо и здорово ... кроме того, что я получаю эту ошибку.

Ошибка 1 Не удается неявно преобразовать тип Sandbox.Factory в Sandbox.IFactory<Sandbox.IProduct>. Существует явное преобразование (вам не хватает приведения?) C: \ ~~ \ Program.cs 12 42 Песочница

Кто-нибудь желает объяснить, почему это так? Я уверен, что Джон Скит или Эрик Липперт могли бы в одно мгновение объяснить, почему это так, но должен быть кто-то, кто не только понимает, ПОЧЕМУ это нельзя сделать вывод, но и может объяснить, как лучше всего решить эту ситуацию.

Ответьте на вопрос здесь

1 Ответ

3 голосов
/ 17 июня 2011

Это потому, что Factory является IFactory< Product>, а то, что вы назначаете ему, является IFactory< IProduct>, а поскольку IFactory не является ковариантным , вы не можете привести обобщенный тип к подтипууниверсальный супертип.

Попробуйте сделать IFactory< out T>, что должно обеспечить выполнение следующего задания.

РЕДАКТИРОВАТЬ :

@ Firoso, в вашем FirosoНа заводском интерфейсе вы пытаетесь создать список, в который вы можете писать.Если ваш интерфейс ковариантен, вы не можете записывать что-либо из-за следующего:

List<object> list = new List<string>(); //This is not possible by the way
list.Add(new {}); //Will fail here because the underlying type is List<string> 

Вы должны игнорировать ковариацию в вашем случае и просто создать вместо нее присвоение IFactory<Product> или изменить фабрику для наследования IFactory<IProduct> вместо этого я рекомендую последнее, но это зависит от вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...