Преобразование типов C # для универсального параметра - PullRequest
2 голосов
/ 24 августа 2010

Это довольно элементарный вопрос C #;мои извинения, но я не смог найти это в другом месте.

Каков наилучший способ конвертировать из Object<class> в Object<interface>?

Т.е.

//fake interface
interface ignu {}

//fake class which implements fake interface
class bee : ignu {}

//function which accepts a generic with the interface
function bang(template<bee>) {}

//template type but with a class that implements the interface
template<bar> foo;

//trying to call the function, but compiler complains it can't implicitly convert
bang(foo); 

//compilers complains that it cannot convert from template<bee> to template<ignu>
bang((template<ignu>)bee)

Может быть, я далеко от базы, но похоже, что это должно работать и быть выполнимым, но решение ускользает от меня.

Редактировать: mygen изменен на шаблон, так как я использовал оба для ссылки нато же самое, что сбивало с толку

Редактировать: в итоге я использовал приведение типа: bang (bee.Cast ());

Ответы [ 4 ]

2 голосов
/ 24 августа 2010

Нет никакой гарантии, что Generic<SubType> действительно может быть использован в качестве замены для Generic<BaseType>.

. Учитывайте следующее:

List<int> intlist = new List<int>();
List<object> objlist = intlist; // compile error
objlist.Add("foo"); // what should be in intlist now?

То, что вы ищете, называется совместными противоречие.Они были добавлены в c # 4.

1 голос
/ 24 августа 2010

.NET 3.5 не имеет Ковариации и Контравариантности в Обобщениях, как указано в MonkeyWrench.Тем не менее, есть встроенные способы, чтобы сделать необходимое литье.

class Program
{
    static void Main(string[] args)
    {
        List<ccc> c = new List<ccc>();
        c.Add(new ccc());

        List<iii> i = new List<iii>(c.Cast<iii>());
    }
}

interface iii
{
    void DoIt();
}

class ccc : iii
{
    public void DoIt()
    {
        throw new NotImplementedException();
    }
}
1 голос
/ 24 августа 2010

Должно быть и находится в .Net 4.0.

Проверьте это: http://msdn.microsoft.com/en-us/library/dd799517.aspx

0 голосов
/ 24 августа 2010

В .NET 3.5 я бы обработал что-то вроде этого в списке, подобном следующему:

list<bar> myList = new list<bar>;
myList.Select<ignu>(x => x).ToList();

Я бы подумал, что не было бы слишком сложно сделать что-то подобное для одного объекта.

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