不能传递委托

本文关键字:不能 | 更新日期: 2023-09-27 17:50:01

我已经创建了一个函数,它可以从用户那里获取控制台输入,只要它符合过滤器。

public delegate TResult OutFunc<in T, TValue, out TResult>(T arg1, out TValue arg2);
public static T PromptForInput<T>(string prompt, OutFunc<string, T, bool> filter)
{
    T value;
    do { Console.Write(prompt); }
    while (!filter(Console.ReadLine(), out value));
    return value;
}

当我像下面这样调用这个方法时,效果很好。只要解析为(0-10)范围内的int,就从用户处获取一个数字。

int num = PromptForInput("Please input an integer: ",
    delegate(string st, out int result)
    { return int.TryParse(st, out result) && result <= 10 && result >= 0; } );

我希望能够重用常见的过滤器。在我的程序的多个地方,我想从用户那里得到一个int输入,所以我把它的逻辑分离出来,并把它放在它自己的函数中。

private bool IntFilter(string st, out int result)
{
    return int.TryParse(st, out result) && result <= 10 && result >= 0;
}

现在我得到一个错误,当我尝试这样做:

int num = PromptForInput("Please input an integer: ", IntFilter);

方法'PromptForInput(string, OutFunc)'的类型参数不能从用法中推断出来。尝试显式指定类型参数。

在这种情况下如何显式指定类型参数?

不能传递委托

您有一个泛型函数,因此需要声明类型:

int num = PromptForInput<int>("Please input an integer: ", IntFilter);

编译器只是说它不能自己弄清楚,需要显式声明。

感谢LordTakkera的回答,我也能找到这个工作。

int num = PromptForInput("Please input an integer: ", new OutFunc<string, int, bool>(IntFilter));

编译器实际上在编译时隐式地做这个,只要你显式地指定PromptForInput<int>。但是,我不明白为什么编译器不能隐式地计算出这个