并非所有代码路径都返回此函数中的值?

时间:2014-06-15 11:06:09

标签: c#

System.IO.File.GetLength以字节为单位给出了文件的大小。我试图做的是取大小,以字节为单位,并将其转换为可能的最高单位,而不要让大小变得小于1.例如,而不是" 2048"显示在大小列中,我想要" 2 KB"显示。这是代码:

 private string sizeDown(string size)
    {
        decimal sizeoffile = Convert.ToDecimal(size);
        int downed = 0;

        do
        {
            sizeoffile = sizeoffile / 1024;
            downed += 1;
        }
        while (sizeoffile > 1024);

        if (downed > 3)
        {
            return "";
        }
        else
        {
            switch (downed)
            {
                case 0:
                    return Convert.ToString(sizeoffile) + " bytes";
                    break;
                case 1:
                    return Convert.ToString(sizeoffile) + " KB";
                    break;
                case 2:
                    return Convert.ToString(sizeoffile) + " MB";
                    break;
                case 3:
                    return Convert.ToString(sizeoffile) + " GB";



            }
        }
    }

但是,正如您可能从标题中看到的那样,Visual Studio告诉我并非所有代码路径都返回一个值。我很困惑。什么大小的值可能导致我的代码没有返回值?

(顺便说一句,我知道我把字符串作为字符串,然后将其转换为小数 - 为方便起见,我这样做。)

4 个答案:

答案 0 :(得分:0)

更改以下行集

if (downed > 3)
        {
            return "";
        }
        else
        {
            switch (downed)
            {
                case 0:
                    return Convert.ToString(sizeoffile) + " bytes";
                    break;
                case 1:
                    return Convert.ToString(sizeoffile) + " KB";
                    break;
                case 2:
                    return Convert.ToString(sizeoffile) + " MB";
                    break;
                case 3:
                    return Convert.ToString(sizeoffile) + " GB";



            }
        }

        switch (downed)
        {
            case 0:
                return Convert.ToString(sizeoffile) + " bytes";
                break;
            case 1:
                return Convert.ToString(sizeoffile) + " KB";
                break;
            case 2:
                return Convert.ToString(sizeoffile) + " MB";
                break;
            case 3:
                return Convert.ToString(sizeoffile) + " GB";
            default : return ""; 

        }
    }

答案 1 :(得分:0)

将此代码与Switch .... Case

一起使用
 private string sizeDown(string size)
    {
        decimal sizeoffile = Convert.ToDecimal(size);
        int downed = 0;

        do
        {
            sizeoffile = sizeoffile / 1024;
            downed += 1;
        }
        while (sizeoffile > 1024);


            switch (downed)
            {
                case 0:
                    return Convert.ToString(sizeoffile) + " bytes";
                    break;
                case 1:
                    return Convert.ToString(sizeoffile) + " KB";
                    break;
                case 2:
                    return Convert.ToString(sizeoffile) + " MB";
                    break;
                case 3:
                    return Convert.ToString(sizeoffile) + " GB";
                    break;
                default:
                    return ""; 
                    break;

            }
        }

答案 2 :(得分:0)

此处出现错误的原因是编译器无法知道将在运行时确定的值,因为它将被确定。即使您知道运行时值永远不会达到它,您也需要为每个值都有一个代码路径。正如其他回复中所提到的,你可以在你的交换机中添加一个默认的返回值,或者你可以抛出异常,如果它是你不希望被击中的条件。

switch (downed)
        {
            case 0:
                return Convert.ToString(sizeoffile) + " bytes";
                break;
            case 1:
                return Convert.ToString(sizeoffile) + " KB";
                break;
            case 2:
                return Convert.ToString(sizeoffile) + " MB";
                break;
            case 3:
                return Convert.ToString(sizeoffile) + " GB";

            default:
                throw new InvalidOperationException();
        }

答案 3 :(得分:0)

首先:downed>时,您的开关案例不会返回任何内容那就是导致错误的原因。其次,您的解决方案将因字节而失败。删除do关键字并将其替换为while语句。

与其他人相比,创造一个完全不同的答案:

private string sizeDown(string size)
{
    long sizeOfFile = long.Parse(size);
    if (sizeOfFile == 1)
        return sizeOfFile + " byte"; 
    if (sizeOfFile < 1024)
        return sizeOfFile + " bytes"; 
    if (sizeOfFile < 1024 * 1024)
        return sizeOfFile / 1024 + " KB"; 
    if (sizeOfFile < 1024 * 1024 * 1024)
        return sizeOfFile / (1024 * 1024) + " MB"; 
    if (sizeOfFile < 1024 * 1024 * 1024 * 1024)
        return sizeOfFile / (1024 * 1024 * 1024) + " GB"; 

    return sizeOfFile / (1024 * 1024 * 1024 * 1024) + " TB"; 
}