2016-06-17 35 views
1

我在學校有一個項目,我的老師要求我們將一個委託添加到Funcs列表中。下面的代碼在AddDel方法中存在問題。 Intellisense告訴我,它不能從代表轉換成Func,但我的老師堅持認爲它應該完全沒有問題。我究竟做錯了什麼?從代表演變爲func

public class TestDelegate 
{ 
    private delegate string MyDel(int iVal, double dVal, char cVal, string sVal); 
    private List<Func<int, double, char, string, string>> _DList; 
    public TestDelegate() { }  
    public void AddDel() 
    {    
     //Creating a delegate 
     MyDel myDel = new MyDel(MyFunction); 
     _DList.Add(myDel); //Adding it to the TestDelegate 
    } 
    public void RunTests() 
    { 
     int idata = 1; 
     double ddata = 5.1; 
     char cdata = 'A'; 
     string sdata = "Method"; 
     foreach (Func<int, double, char, string, string> myDel in _DList) 
      WriteLine(myDel(idata, ddata++, cdata++, sdata + idata++)); 
    } 
    private static string MyFunction(int iVal, double dVal, char cVal, string sVal) 
    { 
     return $"{sVal}:\t{iVal} {dVal}{cVal}"; 
    } 
} 

回答

2

基本上,你不應該在這裏聲明自己的委託。這種委託類型之間沒有轉換。

你想要一個Func<int, double, char, string, string>,所以聲明一個:

Func<int, double, char, string, string> func = MyFunction; 
_DList.Add(func); 

或者更簡單,只需調用地址:

_DList.Add(MyFunction); 

如果你真的想保持你當前的代碼,你可以創建一個Func<...>包裝您的委託:

MyDel myDel = new MyDel(MyFunction); 
var func = new Func<int, double, char, string, string>(myDel); 
_DList.Add(func); //Adding it to the TestDelegate 

......但我並沒有從這裏看到任何好處。

+0

感謝您的回答!但是爲了我的教授想讓我爲這個項目做些什麼,甚至有可能把一個委託給一個Func? – lehast22

+0

@McKenzieWinward:不,它不是。儘管如此,請參閱我的最終補充 - 您可以創建一個包裝舊代理的新代理。請注意,'Func <...> ** **是一個委託類型......它不是你聲明的。 –

+0

我也沒有看到好處,但您的答案正是我一直在尋找的東西。在該項目的標題中,他確實講了一些關於使用包裝的內容。萬分感謝! – lehast22