2008-12-11 46 views
0

編輯:我發現如果將IMetadataType對象轉換爲TMetadata類型,我可以編譯它。爲什麼我需要這樣做?使用C#中的通用方法編譯錯誤

編輯#2:「值」屬性是一個.NET字典的類型< TMetadata,TData >。

我有這樣的泛型方法:

private void FillMetadata<TMetadata, TData> 
    (Metadata<TMetadata, TData> oMetadata) where TMetadata : IMetadataType 
{ 
    IMetadataType o; 
    oMetadata.Values.Add(o, (TData)(object)GetValue()); 
} 

我已經剝離,以簡化執行它(我實際使用一個真正的對象,而不是IMetadataType這裏聲明)。

我的問題是,爲什麼不編譯?編譯錯誤在Add()方法上:「無法從'IMetadataType'轉換爲'TMetadata'。」這不是說方法中的「where」子句是什麼嗎?

我錯過了什麼?

回答

1

where TMetadata : IMetadataType是泛型類型參數TMetadata的一個約束,它表示它應該從IMetadataType派生。由於oMetadata只知道TMetadataTData作爲要使用的類型,因此您必須在方法主體中使用它們。這應該工作:

private void FillMetadata<TMetadata, TData>(Metadata<TMetadata, TData> oMetadata) 
    where TMetadata : IMetadataType 
{ 
    TMetadata o; 
    oMetadata.Values.Add(o, (TData)(object)GetValue()); 
} 
1

如何聲明.Add方法?

好的,如果.Add方法需要一個TMetadata,你不能指望它取一個IMetadataType,因爲你說TMetadata是一個IMetadataType,而不是相反。

基本上,對於所有的編譯器都知道,你可以嘗試添加一些完全不同於TMetadata的東西,並且實現一個通用接口並不重要。

+0

對不起,「值」屬性是類型的字典。 – Carl 2008-12-11 16:23:03

+0

謝謝。你的意思是即使元數據類在類上也有相同的where子句,我仍然無法做到這一點? – Carl 2008-12-11 16:27:21