有没有一种通用的方式来进行此转换?
问题描述:
下面的代码工作时,我输入一个像“15”字符串,但是当我给它一个像15这样的整数,它给了我错误说:“无法投入类型'System.Int32'的对象键入'System.String” 。有没有一种通用的方式来进行此转换?
如何编辑此代码以允许整数输入?注:我是做转换为内循环
using System;
using System.Threading;
namespace ConsoleApplication24
{
internal class Program
{
public static void ThreadMethod(object o)
{
for (int i = 0; i < Int32.Parse((string)o); i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0);
}
}
private static void Main(string[] args)
{
Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));
t.Start("15");
t.Join();
}
}
}
答
尝试
public static void ThreadMethod(object o)
{
var limit = o is string ? Int32.Parse((string)o) : (int)o;
// OR var limit = Int32.Parse(o.ToString());
for (int i = 0; i < limit; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0);
}
}
答
只是传递一个int
,而不是一个字符串,删除Int32.Parse((string)o)
部分和投o
到int
。
for (int i = 0; i < (int)o; i++)
如果你想支持的字符串,以及,你就必须做一些调查(这里用C#7的模式匹配):
int val = /* some default */;
if (o is int oInt) val = oInt;
if (o is string oString) val = Int32.Parse(oString);
如果你需要比单参数的详细数据,你将不得不传递一个对象(并将其转换)。
class Data
{
string oString { get; set; }
int oInt { get; set; }
}
+0
但如果我这样做“15”输入将无法工作这一次。我需要两个输入工作。 – Lyrk
答
有几件事情,你可以在这里做。最简单的是不使用这种类型的转换。当你要去一个字符串,它是非常容易的:
for (int i = 0; i < Int32.Parse(o.ToString()); i++)...
然而,一个更清洁的方式向这将是超载方法:
public static void ThreadMethod(object o)
{
ThreadMethod(Int32.Parse(o.ToString()));
}
public static void ThreadMethod(int o)
{
for (int i = 0; i < o; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0);
}
}
尽管这增加了量的代码,它使你的方法更具可读性。在调用之前,您还可以通过执行检查来将您的呼叫分离出来,方法为int
。通常情况下,你会遇到你不想调用其他方法的情况。即使如此,这种方式消除了正在做你想做的方法内部的模糊性和失败的可能性。
'TheVariable.ToString()'? –
这似乎是一个非常糟糕的主意。使其进入正常状态。 –
方法应该在他们期望的输入中明确。当方法想要的是'int'时传递'object'是误导性的。 – Nkosi