Почему я не могу установить объект, полученный из ObservableCollection , равным объекту, возвращенному как ObservableCollection ?

Я получаю ошибку компиляции: «Не удается неявно преобразовать тип« System.Collections.ObjectModel.ObservableCollection в ProddataRecsObservable ». Существует явное преобразование». См. Комментарии в следующих сегментах кода.

//I created a custom class called ProddataRecsObservable derived from
//ObservableCollection<Proddata> so I can do some special CRUD operations for my production
//data records.

public class ProddataRecsObservable : ObservableCollection<Proddata>
{

}        

//I have another class which maps an object to a reader and the function MappAll returns an 
//Observable collection of type <T>.

public abstract class MapperBase<T>
{
    protected abstract T Map(IDataRecord record);

    public ObservableCollection<T> Mapall(IDataReader reader)
    {
        ObservableCollection<T> collection = new ObservableCollection<T>();

        while (reader.Read())
        {
            try
            {
                collection.Add(Map(reader));
            }
            catch
            {
                throw;
            }
        }

        return collection;
    }
}

//I have another class derived from MapperBase called ProddataMapper.

public class ProddataMapper : WTS.Data.Mapper.MapperBase<Proddata>
{
    protected override Proddata Map(System.Data.IDataRecord record)
    {
        Proddata p = new Proddata();    

        p.PSTAT = (DBNull.Value == record["PSTAT"]) ? "" : record["PSTAT"].ToString();

 return p;
    }
}

//In my calling code, I attempt to set a ProddataRecsObservable variable equal to the 
//result of MapAll() from my ProddataMapper class but get the compile error. The error even 
//tells me they are the same type which is strange. How can I get around this?

//Calling Code:

ProddataMapper prodMapper = new ProddataMapper(); 
ProddataRecsObservable recs = prodMapper.Mapall(ProddataReader); //ERROR'S HERE <-
13.10.2009 14:28:59
4 ОТВЕТА
РЕШЕНИЕ

ObservableCollection<Proddata>не может быть upcasted к ProddataRecsObservable, есть дополнительная логика в ProddataRecsObservableтом , что ObservableCollection<Prodddata>не знает.

1
13.10.2009 14:35:38

Я не вижу, что он говорит вам, что типы одинаковы на всех. ProddataRecsObservableне то же самое, что ObservableCollection<Proddata>- что заставляет вас думать, что они одного типа? Первый тип происходит от второго типа - это не делает их одинаковыми .

Каждый экземпляр ProddataRecsObservableявляется экземпляром из- ObservableCollection<Proddata>за наследственных отношений, но обратное неверно.

То, что вы делаете, является эквивалентом:

class Test : object {}

object Foo()
{
    return new object();
}
...
Test t = Foo();

Вы ожидаете, что это сработает? Если так, почему вы ожидаете, что это сработает? Как компилятор должен знать, что Fooон на самом деле будет возвращать экземпляр Test(которого на самом деле здесь нет - и ваш метод не возвращает экземпляр вашего производного класса)? Если вы не ожидаете, что это сработает, почему вы ожидаете, что ваш пример кода будет работать?

6
13.10.2009 14:32:46
+1 к драйву, почему мимо вернулся к основам. Не дай мне рыбу, научи меня ловить рыбу
Abdullah BaMusa 14.10.2009 05:02:42

Сделайте MapAll () абстрактным в базовом классе, а затем в ProdDataMapper предоставьте переопределение:

public override ProddataRecsObservable Mapall(IDataReader reader)
{
   // do the downcast explicitly
    return (ProddataRecsObservable) base.MapAll(reader);
}
0
13.10.2009 15:02:00

Джон Скит прав. Попробуйте явно привести результат к ProddataRecsObservable в назначении, где вы получите ошибку.

0
13.10.2009 15:06:01