我是C#的新手,需要一些帮助。如果有人能够解释为什么会这样,而不仅仅是给我一个答案,那将非常感激。
我收到以下错误消息:
无法将字符串隐式转换为int
这是我的代码:
int[] arrayData = new int[12];
StreamReader scores = new StreamReader("scores.txt")
while (scores.Peek() != null)
{
arrayData[counter] = scores.ReadLine(); // <-- above error occurs here
counter = counter + 1;
}
scores.Close();
如果有人可以提供帮助,我还有另外一个问题。
string x = …
int y = …
if (x > y) … // <-- below errors occurs here
错误讯息:
运算符&gt;不能应用于string和int
答案 0 :(得分:3)
ReadLine()方法返回一个字符串,并将其分配给int []的一个元素,该元素是一个int数组。因为它是错误的类型,编译器会检查您要分配的类型(字符串)与您为其分配的变量类型(int)之间是否存在自动转换。但是不存在从字符串到int的隐式转换,因为并非所有字符串都可以转换为整数。因此,您“无法隐式地将字符串转换为int”。
你能对这种情况做些什么?在这种情况下,虽然没有隐式转换,但可能存在显式转换。
string foo = scores.ReadLine();
array[counter] = int.Parse(foo);
当然,这假设你读入foo的文本行只包含一个呈现为文本的数字。如果还有其他东西你将需要解析字符串,这涉及更多。
关于比较的第二个问题实际上是同一个问题 - 当您尝试比较两种不同类型时,会尝试隐式转换并失败。然后,您会收到一条无法比较它们的错误消息。解决方案是相同的:根据上面的示例,使用int.Parse(string)将字符串转换为int。
你可以将int转换为如下字符串:
string ystring = y.ToString();
然后你可以将x与ystring进行比较,因为它们都是字符串。但这可能是一个坏主意,因为已转换为字符串的数字与它们按数字排序的方式排序不同:
1
10
2
在Hossein的回答中,您可能会注意到他使用Convert.ToInt(string)而不是int.Parse(string)。它们做同样的事情,但Convert是一个导出各种转换的静态对象。鉴于您刚刚学习类型兼容性,您可能还没有为Convert类的复杂性做好准备。但是,不要让它阻止你检查它并在http://msdn.microsoft.com上阅读它的所有文档,因为你会发现它既有教育意义又有用。
答案 1 :(得分:2)
简答:
使用
int.Parse();
Convert.ToInt32();
像这样的方法:
int[] arrayData = new int[12];
StreamReader scores = new StreamReader("scores.txt")
while (scores.Peek() != null)
{
arrayData[counter] = int.Parse(scores.ReadLine());
counter = counter + 1;
}
scores.Close();
您需要将字符串值转换为int,以便您可以在比较中使用它或在比较中使用它,例如
if (x > y) …
长解释:
错误是自我解释的,您正在读取一个字符串,并试图将其分配给一个完全不同的类型!
ReadLine()方法返回一个字符串,而字符串与int不同
在C#
中,您有不同的类型,并且对于每个类型,您必须使用兼容的值
int
是数字(实际上数字是一个整数,因此您使用int来存储和处理数字(整数值)。
string是一个字符数组,如
"Ali","Alex","Apple",....
在双引号之间放置的任何内容都被视为c#中的字符串 所以基本上
1不等于“1”
虽然它们看起来一样,但它们却完全不同。(就好像你把苹果的图片与真实图片进行比较一样!它们看起来是一样的,但它们完全是两种不同的东西!)
因此,如果您需要从字符串中提取该数字,则需要转换,在这种情况下,如果您想进行转换,则可以使用Convert.ToInt()
方法
你也可以使用:
Int32.Parse();
看看at here 还有一个类似的question here
出于同样的原因,你不能在不同的类型上使用这些运算符。
所以简而言之, 你需要这样做:
int[] arrayData = new int[12];
StreamReader scores = new StreamReader("scores.txt")
while (scores.Peek() != null)
{
arrayData[counter] = int.Parse(scores.ReadLine());
counter = counter + 1;
}
scores.Close();
答案 2 :(得分:1)
虽然string
可以包含有效int
号码的文字表示(例如"1"
),但它不是int
(1
) 。 string
也可以是除整数的文本表示之外的其他内容,例如"ABC"
"ABC" > 1
这样的比较显然没有意义,对吧?这就是>
运算符未针对string
和int
的组合定义的一个原因:在所有情况下都无法保证其有意义。
int x = Console.ReadLine();
无效的原因是相同的:该方法返回string
,您的变量的类型为int
。这些类型不可隐式转换。
以下是您需要做的事情:使用string
或int
将int.Parse
内的整数的文字表示转换为int.TryParse
:
string text = Console.ReadLine(); // get user input; we cannot know whether a number
// was entered or something else!
int a = int.Parse(text); // might throw an exception if `text` doesn't contain
// a textual representation of a valid int number
int b;
if (int.TryParse(text, out b))
{
// contents of `text` could be converted to an `int`, which is now stored in `b`
}
else
{
// contents of `text` could not be converted to an `int`, but no exception
// has been thrown; instead we end up here.
}
答案 3 :(得分:0)
主数组的字符串内容必须转换为目标数组的类型,是哪个整数...所以这里来了:
while (scores.Peek() != null)
{
arrayData[counter] = Convert.ToInt32(score.ReadLine());
counter = counter + 1;
}