2014-01-14 58 views
0

正試圖弄清楚我如何從Converter<string, T>轉換爲Converter<string, object>,當我有約束條件where T : object時。通過將約束更改爲where T : class解決了這個問題,但我不完全確定它爲什麼起作用。從T到具有通用約束的對象的方差對象vs類

這並不編譯:

public void Foo<T>(Converter<string, T> x) where T : object 
{ 
    Converter<string, object> y = x; 
} 

Error: Cannot implicitly convert type 'System.Converter<string,T>' to 'System.Converter<string,object>' 

然而下面呢,這是爲什麼?

public void Foo<T>(Converter<string, T> x) where T : class 
{ 
    Converter<string, object> y = x; 
} 
+1

'object'比'class'更通用。 'object'包含所有對象類型,包括裝箱值類型。 'class'將它限制爲引用類型。不確定「對象」是否意味着任何事情,因爲它本質上意味着你會限制它,但不是真的*! – Magus

+0

@Magus盒裝值類型*會*符合'class'約束。沒有任何東西符合不符合「類」約束的「對象」約束。 – Servy

+0

@Servy:除了可能是有效的語法。如果它是有效的,一個值類型將被自動複製,而類約束特別限制它。 – Magus

回答

1

沒有像: object那樣的通用約束。第一個例子有兩個錯誤:

錯誤1個約束不能特殊類「對象」

然後:

錯誤2無法隱式轉換類型「System.Converter」來'System.Converter'

所以簡單地說,因爲沒有有效的約束,從非約束投射System.Converter<string,T>不能做到Converter<string, object>

第二個例子有一個有效的限制。 T是引用類型,因爲它是類型層次結構的根,所以可以被轉換爲object

+0

確實,不知道我怎麼沒有發現其他錯誤:p謝謝,我會的時候會接受 –