Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个C代码会引发错误?_C# - Fatal编程技术网

C# 为什么这个C代码会引发错误?

C# 为什么这个C代码会引发错误?,c#,C#,真正的新手问题,但为什么这不起作用?我越来越 未赋值变量的使用 “比较” 作为错误 string comparison; Console.WriteLine("Enter the first number"); int firstNum = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Enter the second number"); int se

真正的新手问题,但为什么这不起作用?我越来越

未赋值变量的使用 “比较”

作为错误

        string comparison;
        Console.WriteLine("Enter the first number");
        int firstNum = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Enter the second number");
        int secondNum = Convert.ToInt32(Console.ReadLine());
        if (firstNum == secondNum)
            comparison = "equals to";
        if (firstNum < secondNum)
            comparison = "less than";
        if (firstNum > secondNum)
            comparison = "greater than";
        Console.WriteLine("{0}",comparison);
字符串比较;
Console.WriteLine(“输入第一个数字”);
int firstNum=Convert.ToInt32(Console.ReadLine());
Console.WriteLine(“输入第二个数字”);
int secondNum=Convert.ToInt32(Console.ReadLine());
if(firstNum==secondNum)
comparison=“等于”;
if(firstNumsecondNum)
比较=“大于”;
WriteLine(“{0}”,比较);

因为编译器不知道
比较
在可执行路径中。将三个
ifs
更改为if-then-else:

    if (firstNum == secondNum)
        comparison = "equals to";
    else if (firstNum < secondNum)
        comparison = "less than";
    else
        comparison = "greater than";
if(firstNum==secondNum)
comparison=“等于”;
else if(firstNum

它将工作

您可以将比较设置为string.Empty,当您声明它时也可以设置为Empty…

这几乎是不言自明的-比较不能保证被赋值(有值),编译器因此抛出错误

基本上,if语句可能永远不会将值设置为“comparison”,这就是它失败的原因

解决这个问题的一种快速而肮脏的方法是以类似于下面的方式声明比较

string comparison=“unassigned”


string comparison=string.Empty

这里的其他答案是正确的。问题是C#所有变量在使用之前都必须先检查。

这里的基本问题是编译器不会检查一系列这样的条件,以确定它们组合起来涵盖了所有可能的选项。条件中的任何内容都可能被执行,也就是说,它从不考虑全局


正如Jesse所说,将其设置为单个if-else-if-else,这样编译器就可以看到没有其他路径。无论如何,它的效率稍高一些,因为您的代码总是执行所有三个测试,而他的代码最多执行两个测试。

对于任何拥有2001年Frox开始的C#by的人,您可以在第66页看到这个替代解决方案。因此,在某种程度上,编译器是在预先解决问题并提前引发错误?因为数学逻辑保证比较总是以某种方式分配一个值-是的。如果您真的感兴趣,Daniel提供的链接将比我解释得更好、更深入:-]为什么您的解决方案是一种快速而肮脏的方法?似乎是“正确”的方法否?如果Jesse的解决方案在没有警告的情况下工作,您可以看到它是一个更优雅的解决方案,因为它稍微清楚代码在做什么,以及在您阅读时将分配什么值。代码的可维护性与具有可运行的功能一样重要。实际上,更深入地了解它——按照我建议的方式进行操作通常会导致两次为字符串赋值(一次是在声明字符串时,一次是在if语句或任何匹配的情况下)-在您的示例中,这无关紧要-如果经常调用代码(例如在大循环或类似的情况下),您可能会看到性能下降