2016-06-17 1 views
1

私は先生がFuncのリストに代理人を追加するように私に依頼しているプロジェクトを学校に持っています。私が下にあるコードは、AddDelメソッドに問題があります。 Intellisenseは、代議員から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>をしたいので、1を宣言:

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

関連する問題