0

次のコード セグメントのコメントを参照してください。

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

4 に答える 4

6

タイプがまったく同じであることがわかりません。ProddataRecsObservableと同じではありませんObservableCollection<Proddata>- 彼らが同じタイプだと思う理由は何ですか? 最初のタイプは 2 番目のタイプから派生します。つまり、同じタイプにはなりません。

のすべてのインスタンスは、継承関係によりProddataRecsObservableのインスタンスですObservableCollection<Proddata>が、その逆は当てはまりません。

あなたがしていることは、次のものと同等です:

class Test : object {}

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

それがうまくいくと思いますか?もしそうなら、なぜあなたはそれがうまくいくと期待しますか? 実際にインスタンスを返すことをコンパイラがどのように知ることを意図していFooますか(実際にはここにはありません-また、メソッドは派生クラスのインスタンスを返しません)? それが機能するとは思わないのに、サンプル コードが機能することを期待する理由は何ですか?Test

于 2009-10-13T14:32:46.867 に答える
1

ObservableCollection<Proddata>にアップキャストできません。不明なProddataRecsObservable追加のロジックがありProddataRecsObservableますObservableCollection<Prodddata>

于 2009-10-13T14:35:38.353 に答える
0

基本クラスで MapAll() を抽象化し、ProdDataMapper でオーバーライドを提供します。

public override ProddataRecsObservable Mapall(IDataReader reader)
{
   // do the downcast explicitly
    return (ProddataRecsObservable) base.MapAll(reader);
}
于 2009-10-13T15:02:00.957 に答える
0

ジョン・スキートは正しい。エラーが発生した割り当てで、結果を明示的に ProddataRecsObservable にキャストしてみてください。

于 2009-10-13T15:06:01.933 に答える