【问题标题】:Cannot implicitly convert "string" to "int" when reading integers from a file从文件中读取整数时,无法将“string”隐式转换为“int”
【发布时间】:2014-10-05 08:08:41
【问题描述】:

我是 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 

错误信息:

运算符>不能应用于字符串和整数

【问题讨论】:

  • score 数组的内容是字符串... 你需要在读取文件后考虑一些强制转换,然后再放入int 数组。
  • A string 不是 int,您无法比较它们或将一个值分配给另一个...如果您尝试将字符串 %&* 与 6 进行比较会发生什么?框架会做什么?为了从您的字符串中获取int,您必须使用int.Parseint.TryParse 对其进行解析,然后如果解析成功,您可以使用返回值
  • 最好将帖子中的材料分成两个单独的问题。
  • 离题建议:StreamReader 实现 IDisposable。因此你应该把它放在using block:using (StreamReader scores = new StreamReader(…)) { /* use scores */; scores.Close(); }。这将确保即使在出现意外异常的情况下,当执行流离开该块时,流也会正确关闭/释放。 (不再需要对Close 的显式调用,但这也没有什么坏处。)
  • 通常最好按照我惊恐的外星人的建议分开问题,但在这种情况下不要因为它实际上是同一个问题。这种令人难以置信的基本问题通常在 Stack Overflow 上并不受欢迎。拯救它的是你的陈述,即你对解决方案不太感兴趣,而对理解问题的本质更感兴趣。干得好。

标签: c# string int implicit-conversion


【解决方案1】:

ReadLine() 方法返回一个字符串,您将其分配给 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 上的所有文档,因为您会发现它既有教育意义又有用。

【讨论】:

  • 谢谢彼得,我知道这个问题很基础,因为我才刚刚开始学习 c#。但是您的回答非常有帮助,并且这些解释帮助我现在了解更多。
【解决方案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();

【讨论】:

  • 感谢侯赛因的回答和链接,它帮助我现在了解更多。
  • @Urang18:不客气。现在,您需要接受对您最有帮助的答案之一,作为答案。
  • 经过大家的回答和我的理解,我做了进一步的研究,并提出了这个选项。 int[] scoresInt = arrayData.Select(int.Parse).ToArray();再次感谢
【解决方案3】:

虽然string 可以包含有效int 数字的文本表示(例如"1"),但它不是int (1)。 string 也可能不是整数的文本表示形式,例如"ABC",显然没有像 "ABC" &gt; 1 这样的比较,对吧?这就是为什么&gt; 运算符没有为stringint 的组合定义的原因之一:它不能保证在所有情况下都有意义。

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

您需要执行以下操作:使用int.Parseint.TryParsestring 内的整数的文本表示形式转换为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.
}

【讨论】:

    【解决方案4】:

    主数组的字符串内容必须转换成目标数组的类型,是哪个整数……所以来了:

    while (scores.Peek() != null)
    {
        arrayData[counter] = Convert.ToInt32(score.ReadLine());
        counter = counter + 1; 
    }
    

    【讨论】:

    • 更好。但是你提到的那个“主数组”是什么? (scores.ReadLine() 将返回 string,而不是 string[]。)
    • @stakx:事实上,由于将上述数据结构的过程输入到方法中,我确实将上述文件的内容视为数组字符串。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多