无法隐式转换" string" to" int"从文件中读取整数时

时间:2014-10-05 08:08:42

标签: c# string int implicit-conversion

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

4 个答案:

答案 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"),但它不是int1) 。 string也可以是除整数的文本表示之外的其他内容,例如"ABC" "ABC" > 1这样的比较显然没有意义,对吧?这就是>运算符未针对stringint的组合定义的一个原因:在所有情况下都无法保证其有意义。

int x = Console.ReadLine();无效的原因是相同的:该方法返回string,您的变量的类型为int。这些类型不可隐式转换。

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