无法隐式转换“”;字符串“;至“;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

无法隐式转换“”;字符串“;至“;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")的文本表示,但它不是int1)。string也可能是整数的文本表示之外的东西,例如"ABC",而进行"ABC" > 1这样的比较显然是没有意义的,对吧?这就是为什么没有为stringint的组合定义>运算符的一个原因:它不能保证在所有情况下都有意义。

int x = Console.ReadLine();不起作用的原因是一样的:该方法返回一个string,并且您的变量类型为int。这些类型不能隐式转换。

以下是您需要做的:使用int.Parseint.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; 
}