2014-01-17 28 views
0

所以,我有5基類項目:發行鑄造排序列表<int, T>其中T是一個派生類

File 
FileRecord 
FileDetailRecord : FileRecord 
FileHeaderRecord : FileRecord 
RecordDetail 

那些涉及共同喜歡:

文件包含FileRecords,一個FileRecord既可以是FileDetailRecord或FileHeaderRecord,FileRecords包含RecordDetails

然後我有兩個基類的輸出和輸入的子集。所以我有

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

和輸入相同的東西。我目前遇到的問題是在我的File類(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>' 

我也試過,只是implictly投這樣的:

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

但是,這只是告訴我,我不能隱式轉換它。我從事C#工作已經有好幾個月了,所以我現在非常生疏。任何人都可以指出我在這裏做錯了嗎?

+5

請參閱[協變和反變化](http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)) - 默認情況下C#泛型是不變的。另請參閱[創建變體通用接口](http://msdn.microsoft.com/zh-cn/library/dd997386.aspx)(YMMV)。 – user2864740

+1

爲了幫助解釋爲什麼Covaranace是一個問題,如果'SortedList '包含'InputFileDetailRecord'? (我知道你沒有,但如果我拿了你的代碼,並在晚些時候添加該類) –

+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; 
     } 
    } 
} 

注意上面的代碼缺乏工具ntation詳細信息,它應該是你的設計,而不是我的。

+1

這幾乎是我最終做的。感謝指針! –

+0

我很高興;很高興它有幫助 –