2016-07-13 5 views
1

Есть ли способ выполнить следующее? Вот некоторый упрощенный пол псевдо код, что я пытаюсь сделать:Возможно ли создание анонимных/делегатов, как показано на C#?

class Foo { 

    static public FUNCTION one(int foo, int bar) {  
    return List<Vector> FUNCTION(int num) {  
     List<Vector> v = new List<Vector>(); 
     for (int i = 0; i < num; i++) { 
     v.Add(new Vector(1+foo, 1+bar));  
     } 
     return v; 
    } 

    static public FUNCTION two(int foo, int bar) {  
    return List<Vector> FUNCTION(int num) {  
     List<Vector> v = new List<Vector>(); 
     // Do something else? 
     return v; 
    } 

    }  
} 

Тогда я хотел бы назвать это так:

generic = Foo.one(1, 2); 
List<Vector> v = generic(2); 

generic = Foo.two(1, 2); 
List<Vector> v = generic(2); 

Я думаю, что это вид вдоль линий что Я хочу, но я не уверен, как передать первый набор аргументов в.

public static Func<int, int, List<Vector>> one() 
{ 
    Func<int, List<Vector>> func = (int num) => 
    { 
     List<Vector> v = new List<Vector>(); 
     return v; 
    }; 
    return func; 
} 

ответ

1

Это решение проблемы? Это конструкция под названием Closure. Это всего лишь комбинация того, что у вас уже было.

public static Func<int, List<Vector>> one(int foo, int bar) 
{ 
    Func<int, List<Vector>> func = 
     num => 
     { 
      List<Vector> v = new List<Vector>(); 
      for (int i = 0; i < num; i++) 
      { 
       v.Add(new Vector(1 + foo, 1 + bar)); 
      } 
      return v; 
     }; 

    return func; 
} 
+0

Я считаю, что это именно то, что я пытался сделать. Однако у меня есть один вопрос. Должны ли совпадать обе подписи Func? Вы можете сделать что-то вроде: public static Func > one (int foo, int bar) { Func > func = (num, num2) => {}; return func; } – williamt

+0

Конечно нет. Тип возвращаемого объекта должен быть тем же (или производным), что и определено в сигнатуре функции. Вы также не можете вернуть целое число из функции, которая ожидает возвращаемое значение строки. Если вы хотите вернуть объект 'Func >', просто определите его в обратной сигнатуре вашей 'one' функции. – Fratyx