2009-03-28 9 views
3

次の2行を1つのステートメントに結合する方法はありますか?匿名関数を宣言して使用することは可能ですか?

Func<XmlNode> myFunc =() => { return myNode; }; 
XmlNode myOtherNode = myFunc(); 

私は以下のようなことを試してきましたが、それを動作させることができず、ドキュメントが動作するかどうかを判断できませんでしたか?

XmlNode myOtherNode = ((Func<XmlNode>)() => { return myNode; })(); 

答えて

6

私はあなたがこれを行うために探している理由はわからないけど...

XmlNode myOtherNode = new Func<XmlNode>(() => { return myNode; })(); 

は、トリックを行う必要があります。

2

「トリック」とは、デリゲートを動作させるためにデリゲートのインスタンスを作成する必要があるということです。この例では、代入(myFunc = ...)を実行したときの暗黙の状態です。また、関数を()=> myNodeとして表現することで、より短くすることができます。

XmlNode myOtherOne = new Func<XmlNode>(() => myNode)(); 
2

"headsling"によって投稿された構文が機能します。

奇妙なことには、にもかかわらず、あなたはdelegateとすることができます、ラムダ(=>)と、元の構文を使用することはできません。もちろん

XmlNode myOtherNode = ((Func<XmlNode>) delegate { return myNode; })(); 

、本当の問題がある...なぜ? ...

XmlNode myOtherNode = myNode; 
+0

:私は匿名メソッド内でより多くのをやりたいだけのものより一つの声明。 – sipwiz

+0

おそらくメソッドへのリファクタリング...またはあなたが幸せであれば何でも。 –

0

と間違っている何ちょうど私がミックスに構築本の別の興味深い使用を投げるだろうと思って:

namespace FunWithContractsAndAnonymousDelegates 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Diagnostics.Contracts; 
    using System.Linq; 

    internal static class Program 
    { 
     private static void MySort<T>(T[] array, int index, int length, IComparer<T> comparer) 
     { 
      Contract.Requires<ArgumentNullException>(array != null); 
      Contract.Requires<ArgumentOutOfRangeException>(index >= 0 && index <= array.Length); 
      Contract.Requires<ArgumentOutOfRangeException>(length >= 0 && index + length <= array.Length); 
      Contract.Ensures(new Func<T[], int, int, IComparer<T>, bool>((_array, _index, _length, _comparer) => 
       { 
        T[] temp = (T[])_array.Clone(); 
        Array.Sort(temp, _index, _length, _comparer); 
        return temp.SequenceEqual(_array); 
       })(array, index, length, comparer)); 

      // TODO: Replace with my heavily optimized and parallelized sort implementation... 
      Array.Sort(array, index, length, comparer); 
     } 

     private static void Main(string[] args) 
     { 
      int[] array = { 3, 2, 6, 1, 5, 0, 4, 7, 9, 8 }; 
      MySort(array, 0, array.Length, Comparer<int>.Default); 
      foreach (int value in array) 
      { 
       Console.WriteLine(value); 
      } 
     } 
    } 
} 

匿名デリゲートを宣言し、呼び出すには、私が持っていないことを意味し事後条件をチェックするために(つまりContract.Ensuresの呼び出しで)一度だけ使用するメソッドを宣言します。 「もちろん、本当の問題は、なぜ...か」これは私が今日の現実のためにこれを使用し、見ても同じくらい不自然

...

関連する問題