下面的代码适用于我输入的字符串,如" 15"但是当我给它一个像15这样的整数时,它会给我一个错误说"无法转换类型为#System; Int32'的对象输入' System.String"。
如何编辑此代码以允许整数输入?注意:我在for循环中进行转换
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();
}
}
}
答案 0 :(得分:1)
只需传递int
而不是字符串,然后删除Int32.Parse((string)o)
部分并将o
投射到int
。
for (int i = 0; i < (int)o; i++)
如果你也想支持字符串,你必须做一些调查(这里使用C#7&#39的模式匹配):
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; }
}
答案 1 :(得分:1)
尝试
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);
}
}
答案 2 :(得分:1)
你可以在这做一些事情。到目前为止最简单的方法是不使用那种类型的转换。当你去一个字符串时,很容易:
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
方法的调用。通常情况下,您会遇到除了调用其他方法之外还要做更多事情的情况。即使如此,这种方式也可以消除你想要的方法中的模糊性和失败的可能性。