2009-03-28 2 views
3

Есть ли способ объединить следующие две строки в один оператор?Можно ли объявить и использовать анонимную функцию в одном заявлении?

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

Синтаксис, отправленный «хэдлингом», работает.

Как ни странно, даже если вы не можете использовать оригинальный синтаксис с лямбда (=>), вы можете с 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).

Как надуманный, как это может выглядеть, я использовал это для реального сегодня ...

Смежные вопросы