2012-07-10 67 views
7

我有一個類,必須接受方法以調用它們以及執行其他執行。這些方法必須多次使用,對許多不同的用戶來說越簡單越好。動作和功能<T>沒有明確鑄造

爲了解決這個問題,我有兩個方法:

void Receive(Action func) 
    { 
     // Do some things. 
     func(); 
    } 

    T Receive<T>(Func<T> func) 
    { 
     // Do some things. 
     return func(); 
    } 

(其實我有34種方法,以能夠接收任何不同的行動或FUNC。菜單中定義的)

然後,我想能夠通過任何方法作爲參數傳遞給接收功能,能夠做這樣的事情:

void Test() 
    { 
     Receive(A); 
     Receive(B); 
    } 

    void A() 
    { 
    } 

    int B() 
    { 
     return 0; 
    } 

就像這樣,它給了我一個接收錯誤(B):

The call is ambiguous between the following methods or properties: 'Class1.Receive(System.Action)' and 'Class1.Receive<int>(System.Func<int>)' 

好吧,簽名是一樣的(雖然沒有錯誤顯示,如果我不使用的方法)。

如果我刪除接收(行動)的方法,我得到接收(A)以下錯誤:

The type arguments for method 'Class1.Receive<T>(System.Func<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 

但我在這種情況下類型爲void,並禁止使用它作爲一個通用的參數。

那麼,有沒有辦法讓我的接收方法沒有使用任何明確的行動或Func轉換?

回答

3

嘗試指定的泛型類型參數明確:

Receive<int>(B); 
+0

有了這個,如果我有一個方法,例如,四個參數我還要做一個演員和包括所有的人。例如:接收<列表,字符串,int,int>(C,myObject1,string1,int1,int2) – Alfort 2012-07-11 17:03:30

+0

這不是真的在這種情況下鑄造(一切都發生在編譯時),但我明白你的意思。你確定你需要這種通用的方法嗎? – 2012-07-11 17:08:29

+0

是的,它是一個通用類,必須能夠接受任何類型的方法。 – Alfort 2012-07-12 07:23:59

4

不,你不能做到這一點 - void不是Func<T>有效的返回類型。你能做的最好的是包裝在一個Func<object>

Receive(() => { A(); return null; }); 
+0

我得到了與此代碼相同的編譯錯誤。但是'return 0;'或'return true;'起作用了!謝謝! – 2016-02-28 00:01:15