简体   繁体   English

发布强制排序列表 <int, T> 其中T是派生类

[英]Issue casting a SortedList<int, T> where T is a derived class

So, I have a project with 5 base classes: 因此,我有一个包含5个基本类的项目:

File
FileRecord
FileDetailRecord : FileRecord
FileHeaderRecord : FileRecord
RecordDetail

Those relate together like: 这些关系在一起,例如:

A File contains FileRecords, a FileRecord can either be a FileDetailRecord or FileHeaderRecord, and FileRecords contain RecordDetails 文件包含FileRecords,FileRecord可以是FileDetailRecord或FileHeaderRecord,而FileRecords包含RecordDetails

I then have two subsets of those base classes, Output and Input. 然后,我有了这些基类的两个子集,即Output和Input。 So I have 所以我有

OutputFile : File
OutputFileDetailRecord : FileDetailRecord
OutputFileHeaderRecord : FileHeaderRecord
OutputRecordDetail : RecordDetail

and the same thing for Input. 与Input相同。 The issue I'm currently having is with one of the members in my File classes (File, OutputFile, InputFile). 我目前遇到的问题是我的文件类中的成员之一(文件,输出文件,输入文件)。

My file class is written like so: 我的文件类是这样写的:

public class File {

    public virtual FileHeaderRecord FileHeaderRecord { get { return fileHeaderRecord; } }
    protected virtual FileHeaderRecord fileHeaderRecord { get; set; }

    public virtual SortedList<int, FileDetailRecord> FileDetailRecords { get { return fileDetailRecords; } }
    protected virtual SortedList<int, FileDetailRecord> fileDetailRecords { get; set; }

}

What I'm trying to do in my OutputFile class is: 我要在OutputFile类中尝试做的是:

public class OutputFile : File {

    public override FileHeaderRecord FileHeaderRecord {
        get {
            if (fileHeaderRecord == null)
                fileHeaderRecord = new OutputFileHeaderRecord();

            return fileHeaderRecord;
        }
    }       

    public override SortedList<int, FileDetailRecord> FileDetailRecords {
        get {
            if (fileDetailRecords == null)
                fileDetailRecords = (SortedList<int, OutputFileDetailRecord>)new SortedList<int, FileDetailRecord>();
        }
    }

}

With my OutputFileDetailRecord class: 与我的OutputFileDetailRecord类:

public class OutputFileDetailRecord : FileDetailRecord {

    public OutputFileDetailRecord()
        : base() {

    }

    public override bool IsValid {
        get {
            return base.IsValid;
        }
    }

}

The error I'm getting is 我得到的错误是

Error   1   Cannot convert type     'System.Collections.Generic.SortedList<int,MerchBulkLoad.Utils.Base.FileDetailRecord>' to     'System.Collections.Generic.SortedList<int,MerchBulkLoad.Utils.Output.OutputFileDetailRecord>'

I also tried to just implictly cast it like this: 我还尝试隐式地将其像这样进行投射:

fileDetailRecords = new SortedList<int, OutputFileDetailRecord>();

But that just told me I couldn't implicitly cast it. 但这只是告诉我,我无法隐式转换它。 It's been several months since I worked with C# at all so I'm extremely rusty at the moment. 自从我开始使用C#已经有几个月了,所以我现在非常生锈。 Can anyone point out what I'm doing wrong here? 谁能指出我在这里做错了什么?

As the comments told, generic types are invariant; 正如评论所言,泛型类型是不变的。 and you are encountering the variance problem with your class design. 并且您的类设计遇到了方差问题。 Define your own sorted list contract, life can be easy. 定义自己的排序列表合同,生活会很轻松。

Say we declare the interface IMySortedList and we can use it instead of SortedList to declare the properties in your classes : 假设我们声明了接口IMySortedList ,我们可以使用它代替SortedList来声明类中的属性:

public interface IMySortedList<TKey, out TValue>: IEnumerable {
    // .. 
}

and a class implements it: 然后一个类实现它:

public class MySortedList<TKey, TValue>
    : SortedList<TKey, TValue>, IMySortedList<TKey, TValue> {
    // .. 
}

So that we can say: 这样我们可以说:

public class OutputFile: File {
    public override FileHeaderRecord FileHeaderRecord {
        get {
            if(fileHeaderRecord==null) {
                fileHeaderRecord=new OutputFileHeaderRecord();
            }

            return fileHeaderRecord;
        }
    }

    public override IMySortedList<int, FileDetailRecord> FileDetailRecords {
        get {
            if(fileDetailRecords==null) {
                fileDetailRecords=
                    new MySortedList<int, OutputFileDetailRecord>();
            }

            return fileDetailRecords;
        }
    }
}

Note the code above lacked the implementation detail, it should be of your design, not of mine .. 请注意,上面的代码缺少实现细节,它应该是您的设计,而不是我的..

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM