Почему я не могу установить объект, полученный из ObservableCollection <Proddata>, равным объекту, возвращенному как ObservableCollection <Proddata>? - PullRequest
0 голосов
/ 13 октября 2009

Я получаю ошибку компиляции: «Не удается неявно преобразовать тип '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 <-

Ответы [ 4 ]

6 голосов
/ 13 октября 2009

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

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

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

class Test : object {}

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

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

1 голос
/ 13 октября 2009

ObservableCollection<Proddata> нельзя повысить до ProddataRecsObservable, в ProddataRecsObservable есть дополнительная логика, о которой ObservableCollection<Prodddata> не знает.

0 голосов
/ 13 октября 2009

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

0 голосов
/ 13 октября 2009

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

public override ProddataRecsObservable Mapall(IDataReader reader)
{
   // do the downcast explicitly
    return (ProddataRecsObservable) base.MapAll(reader);
}
...