2012-07-19 79 views
1

我正在嘗試使用一個委託,Func <對象,T >,共同沒有成功。儘管T可轉換爲對象,但Func <對象,T >似乎不可轉換爲Func <對象,對象>即使Func <對象,字符串>(或任何其他具體類型)也可轉換爲Func <對象,對象>如預期的那樣。請參閱下面顯示問題的代碼。協變量和反變量與泛型類型參數一起工作嗎?

public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) 
    { object o1; 
     T o2 = default(T); 
     o1 = o2; // works fine 

     Func<object, object> f1 = o => o.GetType(); 
     Func<object, T> f2 = o => o as T; 

     f1 = f2; //gives conversion error. 
     f1 = f2 as Func<object, object>; // f2 as Func<object, object> is always null 

     Func<object[], string> f1 = input => input.GetType().Name; 
     Func<object[], object> f2 = input => new object(); 

     f2 = f1 // works fine 

    } 

msdn documentation沒有直接從我所見過的泛型類型參數的情況。任何人都可以解釋這裏發生了什麼?

回答

0

您需要對泛型參數應用類型約束。

更改你的函數原型:

public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) where T : class 

在這一行:

Func<object[], object> f2 = input => new object(); 

...你還需要轉換的對象要創建到T.

+0

是你確定?我以前嘗試過類限制無濟於事。我也嘗試使用'where T:object',但編譯器不允許這樣做。我會仔細檢查,只是爲了確保我沒有通過睡眠剝奪做出其他愚蠢的錯誤! – ejspencer 2012-07-19 17:45:59

+0

當我進行了上述兩個更改時,它爲我編譯......編譯器現在給你的錯誤是什麼? – Dylan 2012-07-20 01:22:41

+0

或者是你看到一些奇怪的運行時行爲? – Dylan 2012-07-20 02:20:38