2016-06-17 45 views
1

Ich habe ein Projekt in der Schule, wo mein Lehrer uns fragt, einen Delegierten zu einer Liste von Funks hinzuzufügen. Der Code, den ich unten habe, hat Probleme in der AddDel-Methode. Intellisense sagt mir, dass es nicht vom Delegierten in einen Func umgewandelt werden kann, aber mein Lehrer besteht darauf, dass es das ohne Probleme tun sollte. Was mache ich falsch?Cast von einem Delegaten zu einem 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}"; 
    } 
} 

Antwort

2

Grundsätzlich sollten Sie hier Ihren eigenen Delegaten überhaupt nicht deklarieren. Zwischen diesen Delegattypen gibt es keine Konvertierungen.

Sie wollen ein Func<int, double, char, string, string>, so erklären ein:

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

Oder einfach mehr, rufen Sie einfach hinzufügen:

_DList.Add(MyFunction); 

Wenn Sie wirklich Ihre aktuellen Code behalten möchten, können Sie eine Func<...> erstellen dass wraps Ihr Delegierter:

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

... aber davon sehe ich keinen Nutzen.

+0

Danke für die Antwort! Aber wegen dem, was mein Professor von mir für das Projekt möchte, ist es sogar möglich, einen Delegierten zu einem Func zu entsenden? – lehast22

+0

@ McKenzieWinward: Nein, ist es nicht. Sehen Sie sich meine letzte Ergänzung an - Sie können einen neuen Delegaten erstellen, der den alten umschließt. Beachten Sie, dass der "Func <...>" ** ein Delegattyp ist ... es ist einfach nicht einer, den Sie deklariert haben. –

+0

Ich sehe auch nicht die Vorteile, aber Ihre Antwort ist genau das, wonach ich gesucht habe. In der Rubrik für das Projekt hat er etwas über die Verwendung eines Wrappers gesagt. Danke vielmals! – lehast22