正試圖弄清楚我如何從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;
}
'object'比'class'更通用。 'object'包含所有對象類型,包括裝箱值類型。 'class'將它限制爲引用類型。不確定「對象」是否意味着任何事情,因爲它本質上意味着你會限制它,但不是真的*! – Magus
@Magus盒裝值類型*會*符合'class'約束。沒有任何東西符合不符合「類」約束的「對象」約束。 – Servy
@Servy:除了可能是有效的語法。如果它是有效的,一個值類型將被自動複製,而類約束特別限制它。 – Magus