我有两种方法。它们非常相似。我尝试使用泛型,但不适用于TryParse()
public static int EnterIntengerNumber()
{
while (true)
{
Console.Write("Enter an intenger number: ");
if (int.TryParse(Console.ReadLine(), out int number))
{
return number;
}
else
{
ConsoleError("Incorrect value");
}
}
}
public static double EnterRealNumber()
{
while (true)
{
Console.Write("Enter a number: ");
if (double.TryParse(Console.ReadLine(), out double number))
{
return number;
}
else
{
ConsoleError("Incorrect value");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何合并或重构它们?
您可以创建函数,该函数接受带有TryParse参数的委托并返回通用值。另外,您可以/必须输入字符串以询问正确的类型。但这可以通过以下示例进行改进:
static void Main(string[] args)
{
var myDouble = EnterSomething<double>("a double", double.TryParse);
var myInt = EnterSomething<int>("an interger", int.TryParse);
Console.WriteLine(myDouble);
Console.WriteLine(myInt);
Console.ReadLine();
}
public delegate bool TryParseFunction<Tout>(string input, out Tout output);
public static Tout EnterSomething<Tout>(string typeName, TryParseFunction<Tout> parser)
{
while (true)
{
Console.Write("Enter " + typeName + " number: ");
if (parser(Console.ReadLine(), out Tout number))
{
return number;
}
else
{
Console.WriteLine("Incorrect value");
}
}
}
Run Code Online (Sandbox Code Playgroud)
小小的附加说明:int.TryParse-传递给EnterSomething的方法不是调用TryParse。实际上,它只是“传递”函数,以便可以在EnterSomething中调用它。
不使用的原因Func<>是它不支持out变量,请参见此处的示例:带有out参数的Func <T>
编辑:我删除了Tin类型的参数,因为无论如何输入都是字符串。