C# 使用带float的cast和parse时接收完全不同的答案

C# 使用带float的cast和parse时接收完全不同的答案,c#,parsing,casting,console.readline,C#,Parsing,Casting,Console.readline,我正在学习用C#编写代码,因为我喜欢这门语言所能提供的东西,在一次学习练习中,我遇到了一个问题 练习的要点是学习声明变量、使用变量和显示变量 我的代码是这样运行的: //Declare variables float originalFahrenheit; float calculatedFahrenheit; float calculatedCelsius; //Asks for fahrenheit Conso

我正在学习用C#编写代码,因为我喜欢这门语言所能提供的东西,在一次学习练习中,我遇到了一个问题

练习的要点是学习声明变量、使用变量和显示变量

我的代码是这样运行的:

//Declare variables
        float originalFahrenheit;
        float calculatedFahrenheit;
        float calculatedCelsius;

        //Asks for fahrenheit
        Console.Write("Enter temperature in fahrenheit: ");
        originalFahrenheit = float.Parse(Console.ReadLine());

        //Calculations
        calculatedCelsius = ((originalFahrenheit - 32) / 9) * 5;
        calculatedFahrenheit = ((calculatedCelsius * 9) / 5) + 32;

        //Display calculations
        Console.WriteLine(originalFahrenheit + " degrees fahrenheit is " + calculatedCelsius + " degrees celsius");
        Console.WriteLine(calculatedCelsius + " degrees celsius is " + calculatedFahrenheit + " degrees fahrenheit");

        Console.ReadKey();
当用户输入“70”华氏度时,正确显示答案

输入华氏温度:70

70华氏度是21.11111摄氏度

21.11111摄氏度是70华氏度

现在,我尝试使用“casting”,只是因为编译了代码,但结果不同:

代码如下:

        //Asks for fahrenheit
        Console.Write("Enter temperature in fahrenheit: ");
        originalFahrenheit = (float)Console.Read;
这就是我得到的答案:

输入华氏温度:70

55华氏度是12.77778摄氏度

12.77778摄氏度是55华氏度

我想知道为什么会这样。在这种情况下,强制转换是不好,还是我的语法不好


请再问一个问题。更改时:

originalFahrenheit = float.Parse(Console.ReadLine());
originalFahrenheit=(浮动)控制台。读取

我有个例外。请看下图:

它基本上告诉我不能将类型“string”转换为“float”

更改时:

originalFahrenheit = float.Parse(Console.ReadLine());

我还有一个例外。请看下面:

异常告诉我无法将类型“int”转换为“string”

为什么会这样?“ReadLine”和“Read”在代码中是如何发挥作用的?

C#不允许从
字符串
转换为
浮动
。必须使用
Float.Parse()
显式执行此类操作

代码读取55度的原因是
Console.Read()
从输入流读取下一个字符。该字符被简单地编码为整数,因此这里允许强制转换,您不会得到异常。此外,如果您检查ASCII表(例如这里),您将看到7(您的第一个字符)编码为55

您的下一篇文章在
Console.ReadLine()
中引发异常的原因是该函数返回一个
字符串(输入流中所有字符的字符串,直到下一个新行字符)。在这种情况下,正如我们之前确定的,C#不允许铸造

Float.Parse(Console.Read())
并不完全有意义,因为
Float.Parse
需要一个字符串,但正如上面指出的那样,
Console.Read()
返回一个
int


有关更多信息,请参阅MSDN中的以下参考资料:

Console.Read返回一个整数,该整数表示键入的单个字符的代码。(您可以在55值中看到它,因为这是字符“7”的ASCII码)要读取整个“70”号码,您需要两次调用才能读取。使用Console.ReadLineOh。我现在明白为什么55出现了。那么“不能将int转换为string”呢?使用“float.Parse(Console.Read())”?如果因为我使用了“read”,所以程序只能读取“7”,为什么它会告诉我不能将int转换为string?我真的希望大家能理解我的意思。如果系统不支持cast,或者您已经为它编写了一个脚本,那么就不能使用cast。现在支持将int转换为float(读案例),不支持将字符串转换为float(ReadLine)。最后一个问题(float.Parse)是错误的,因为Parse需要一个字符串,而您需要传递一个整数。我还应该补充一点,使用float.Parse转换float变量中的用户输入是非常危险的。如果用户键入的不是有效的浮点数,代码将抛出异常(请尝试输入“ABC”并查看)。解析用户输入时始终使用float.TryParse是一个很好的实践。真的吗?谢谢你的提示!
originalFahrenheit = float.Parse(Console.Read());