2014-11-08 4 views
3

К сожалению, я не могу видеть этот вопрос такой же, поэтомуC в качестве аргумента

Я должен выполнить много аналогичных функций, и я хочу, чтобы создать одну функцию, которая будет принимать функции в качестве аргумента, например,

int Search (Func<bool> func) 
    { 
     int start = Environment.TickCount; 
     func(); 
     int end = Environment.TickCount; 
     return end - start; 
    } 

    void SearchTime() 
    { 
     int time1 = Search(list.Contains(item)); 
     int time2 = Search(dictionary.ContainsKey(anotheritem)); 
     /* some more code */ 
    } 

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

UPD: Ошибка говорит: The most appropriate overloaded method has some invalid arguments

+0

Пожалуйста предоставить сообщение об ошибке. – Christian

+0

@ B.K. На самом деле у меня нет аргументов, и я использую существующие функции, но Гуффа дал точный ответ. Может быть, это похоже, но я не нахожу ответа в этом вопросе –

ответ

10

То, что вы пытаетесь отправить в метод не являются делегатами.

Вы можете использовать лямбда-выражения для создания делегатов для метода:

int time1 = Search(() => list.Contains(item)); 
int time2 = Search(() => dictionary.ContainsKey(anotheritem)); 

() представляет нулевые входные параметры.

2

Что вы сделали:

Search(list.Contains(item)); 

это будет первым оценить внутреннее выражение list.Contains(item), который является логическим значением, а не функция с логическим значением возврата. Затем это значение, а не функция, будет передано в Search(), что невозможно и приведет к ошибке компилятора.

У вас есть два варианта: использовать лямбда-выражения, как было отмечено Guffa уже:

class Program 
{ 
    static void Main(string[] args) 
    { 
     SearchTime(); 
    } 

    static int Search(Func<bool> func) 
    { 
     int start = Environment.TickCount; 
     func(); 
     int end = Environment.TickCount; 
     return end - start; 
    } 

    static void SearchTime() 
    { 
     IList<string> list = new []{"item"}; 
     IDictionary<string, string> dictionary = new Dictionary<string, string> { { "key", "value" } }; 

     int ticks1 = Search(() => list.Contains("item")); // Note: use() => 
     int ticks2 = Search(() => dictionary.ContainsKey("key")); // Note: use() => 
     /* some more code */ 
    } 
} 

Если вам не нравится синтаксис () =>, вы можете поместить код в отдельные методы:

class Program2 
{ 
    static void Main(string[] args) 
    { 
     SearchTime(); 
    } 

    static int Search(Func<bool> func) 
    { 
     int start = Environment.TickCount; 
     func(); 
     int end = Environment.TickCount; 
     return end - start; 
    } 

    static void SearchTime() 
    { 
     int ticks1 = Search(ListContains); // Note: do not use() on ListContains 
     int ticks2 = Search(DictionaryContainsKey); // Note: do not use() on DictionaryContainsKey 
     /* some more code */ 
    } 

    static IList<string> list = new[] { "" }; 
    static bool ListContains() 
    { 
     return list.Contains("item"); 
    } 

    static IDictionary<string, string> dictionary = new Dictionary<string, string> {{"key","value"}}; 
    static bool DictionaryContainsKey() 
    { 
     return dictionary.ContainsKey("key"); 
    } 
} 
Смежные вопросы