3 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以創(chuàng)建一個(gè)函數(shù),它接受一個(gè)帶有TryParse參數(shù)和返回值的委托作為通用的。你也可以/將不得不制作字符串來詢問正確的類型。但這可以從這個(gè)例子中得到改進(jìn):
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");
}
}
}
小的額外解釋:int.TryParse傳遞給 EnterSomething 的不是調(diào)用 TryParse。它實(shí)際上只是“傳遞”函數(shù),以便可以在 EnterSomething 中調(diào)用它。
不使用的原因Func<>
是它不支持輸出變量,請(qǐng)看這里的一些例子:Func<T> with out parameter
編輯:我刪除了 Tin 類型參數(shù),因?yàn)闊o論如何輸入都是字符串。

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
你可以這樣試試:
public static int EnterIntengerNumber()
{
return EnterNumber(t => int.TryParse(t, out int v) ? (int?)v : null)
}
public static double EnterRealNumber()
{
return EnterNumber(t => double.TryParse(t, out double v) ? (double?)v : null)
}
private static T EnterNumber<T>(Func<string, T?> tryParse) where T : struct
{
while (true)
{
Console.Write("Enter a number: ");
T? result = tryParse(Console.ReadLine());
if (result.HasValue)
{
return result.Value;
}
else
{
ConsoleError("Incorrect value");
}
}
}

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
您可以使用Convert.ChangeType
請(qǐng)記住,您最終將使用裝箱,因此失去了使用泛型的意義。盡管您最終確實(shí)擁有更少的代碼。
public static T EnterNumber<T> ()
{
while (true)
{
Console.Write("Enter an " + typeof(T) + " number: ");
try
{
return (T) Convert.ChangeType(Console.ReadLine(), typeof(T));
}
catch (FormatException ex)
{
Console.Write("Incorrect format" + ex.Message);
}
}
}
- 3 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)