无法隐式转换“”;字符串“;至“;int”;从文件中读取整数时
本文关键字:文件 整数 读取 int 字符串 转换 | 更新日期: 2023-09-27 18:25:31
我是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
错误消息:
运算符>不能应用于字符串和int
ReadLine()方法返回一个字符串,并且您正在将其分配给int数组的int[]元素。由于它的类型错误,编译器检查您正在分配的类型(字符串)和您正在分配它的变量的类型(int)之间是否有自动转换。但不存在从字符串到int的隐式转换,因为并非所有字符串都可以转换为int。因此,您"无法将字符串隐式转换为int"。
对于这种情况,你能做些什么?在这种情况下,虽然没有隐式转换,但可能存在显式转换。
string foo = scores.ReadLine();
array[counter] = int.Parse(foo);
当然,这假设您读取到foo中的文本行只包含一个呈现为文本的数字。如果还有其他东西需要解析字符串,这需要更多的内容。
您关于比较的第二个问题实际上是同一个问题——当您尝试比较两种不同类型时,尝试了隐式转换,但失败了。然后你会收到一条错误消息,说你无法比较它们。解决方案是一样的:按照我上面的例子,使用int.Parse(字符串)将字符串转换为int。
您可以将int转换为如下字符串:
string ystring = y.ToString();
然后你可以将x和ystring进行比较,因为它们都是字符串。但这可能是个坏主意,因为被转换为字符串的数字与它们作为数字的排序方式不同:
1
10
2
在Hossein的回答中,你可能会注意到他使用Convert.ToInt(字符串)而不是int.Parse(字符串)。他们做同样的事情,但Convert是一个导出各种转换的静态对象。考虑到您现在才刚刚学习类型兼容性,您可能还没有为Convert类的复杂性做好准备。但不要让它阻止你检查它并阅读它的所有文档http://msdn.microsoft.com因为你会发现它既有教育意义又有用。
简短回答:
使用任一
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来存储和处理数字(整数值)
字符串是一个字符数组,例如
"Ali","Alex","Apple",....
任何放在双引号之间的东西都被认为是c#中的字符串
所以基本上
1不等于"1"
虽然它们看起来一样,但却完全不同。
因此,如果你需要从字符串中提取这个数字,你需要转换,在这种情况下,如果你想进行转换,你可以使用Convert.ToInt()
方法您也可以使用:
Int32.Parse();
看看这里这里还有一个类似的问题
出于同样的原因,您不能在不同类型上使用此类运算符。
长话短说,你需要这样做:
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();
虽然string
可以包含有效int
数字(如"1"
)的文本表示,但它不是int
(1
)。string
也可能是整数的文本表示之外的东西,例如"ABC"
,而进行"ABC" > 1
这样的比较显然是没有意义的,对吧?这就是为什么没有为string
和int
的组合定义>
运算符的一个原因:它不能保证在所有情况下都有意义。
int x = Console.ReadLine();
不起作用的原因是一样的:该方法返回一个string
,并且您的变量类型为int
。这些类型不能隐式转换。
以下是您需要做的:使用int.Parse
或int.TryParse
:将string
中整数的文本表示转换为int
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.
}
主数组的字符串内容必须转换为目标数组的类型,即哪个整数。。。所以它来了:
while (scores.Peek() != null)
{
arrayData[counter] = Convert.ToInt32(score.ReadLine());
counter = counter + 1;
}