所以,我有一个包含5个基类的项目:
File
FileRecord
FileDetailRecord : FileRecord
FileHeaderRecord : FileRecord
RecordDetail
那些联系起来像:
文件包含FileRecords,FileRecord可以是FileDetailRecord或FileHeaderRecord,FileRecords包含RecordDetails
然后我有两个基类的子集,输出和输入。所以我有
OutputFile : File
OutputFileDetailRecord : FileDetailRecord
OutputFileHeaderRecord : FileHeaderRecord
OutputRecordDetail : RecordDetail
与输入相同。我目前遇到的问题是我的文件类(File,OutputFile,InputFile)中的一个成员。
我的文件类是这样编写的:
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; }
}
我在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>();
}
}
}
使用我的OutputFileDetailRecord类:
public class OutputFileDetailRecord : FileDetailRecord {
public OutputFileDetailRecord()
: base() {
}
public override bool IsValid {
get {
return base.IsValid;
}
}
}
我得到的错误是
Error 1 Cannot convert type 'System.Collections.Generic.SortedList<int,MerchBulkLoad.Utils.Base.FileDetailRecord>' to 'System.Collections.Generic.SortedList<int,MerchBulkLoad.Utils.Output.OutputFileDetailRecord>'
我也试图像这样暗示:
fileDetailRecords = new SortedList<int, OutputFileDetailRecord>();
但那只是告诉我,我无法暗中施展它。自从我使用C#以来已经有几个月了,所以我现在非常生疏。谁能指出我在这里做错了什么?
答案 0 :(得分:1)
正如评论所述,泛型类型是不变的;并且您遇到了类设计的方差问题。定义自己的排序列表合同,生活可以很容易。
假设我们声明了接口IMySortedList
,我们可以使用它代替SortedList
来声明类中的属性:
public interface IMySortedList<TKey, out TValue>: IEnumerable {
// ..
}
并且一个类实现它:
public class MySortedList<TKey, TValue>
: SortedList<TKey, TValue>, IMySortedList<TKey, TValue> {
// ..
}
这样我们就可以说:
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;
}
}
}
请注意,上面的代码缺少实现细节,它应该是您的设计,而不是我的..