不能传递委托
本文关键字:不能 | 更新日期: 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>
。但是,我不明白为什么编译器不能隐式地计算出这个