2009-10-13 2 views
0

Я получаю ошибку компиляции: «Невозможно неявно преобразовать тип« System.Collections.ObjectModel.ObservableCollection в ProddataRecsObservable ». Явное преобразование существует» См. Комментарии в следующих сегментах кода.Почему я не могу установить объект, полученный из ObservableCollection <Proddata>, равный объекту, возвращаемому как ObservableCollection <Proddata>?

//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 <- 

ответ

1

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

6

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

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

Что вы делаете это эквивалент:

class Test : object {} 

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

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

+0

+1 для перехода к почему, вернувшись к основам. Не дай мне рыбу научить меня рыбе –

0

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

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

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

Смежные вопросы