2009-10-13 11 views
0

Je reçois une erreur de compilation, "Impossible de convertir implicitement le type 'System.Collections.ObjectModel.ObservableCollection en ProddataRecsObservable' Une conversion explicite existe" Voir les commentaires dans les segments de code suivants.Pourquoi ne puis-je pas définir l'objet dérivé de ObservableCollection <Proddata> égal à l'objet renvoyé comme 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 <- 

Répondre

1

ObservableCollection<Proddata> ne peut pas être upcasted à ProddataRecsObservable, il est logique supplémentaire dans ProddataRecsObservable que ObservableCollection<Prodddata> ne connaît pas.

6

Je ne vois pas que cela vous indique que les types sont les mêmes. ProddataRecsObservable n'est pas la même chose que ObservableCollection<Proddata> - Qu'est-ce qui vous fait penser qu'ils sont du même type? Le premier type dérive du deuxième type - cela ne fait pas le même type.

Chaque instance de ProddataRecsObservable est une instance de ObservableCollection<Proddata> en raison de la relation d'héritage, mais l'inverse n'est pas vrai.

Ce que vous faites est est l'équivalent de:

class Test : object {} 

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

Voulez-vous attendre à ce que de travailler? Si oui, pourquoi voudriez-vous que cela fonctionne? Comment le compilateur doit-il savoir que Fooretournera une instance de (ce qui n'est pas le cas ici - et votre méthode ne retourne pas une instance de votre classe dérivée)? Si vous ne serait pas attendre que cela fonctionne, pourquoi voudriez-vous que votre exemple de code fonctionne?

+0

+1 pour conduire à pourquoi par retour à l'essentiel. Ne me donnez pas un poisson, apprenez-moi à pêcher –

0

Faire MapAll() abstraite dans la classe de base, puis dans le ProdDataMapper fournissent le remplacement:

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

John Skeet a raison. Essayez de convertir explicitement le résultat en ProddataRecsObservable dans l'affectation où vous obtenez l'erreur.

Questions connexes