Что не так с этим методом C #? - PullRequest
3 голосов
/ 20 апреля 2010

Я использую этот метод, чтобы получить расширение файла,

public string ReturnExtension(string fileExtension)
    {
        switch (fileExtension)
        {
            case ".doc":
            case ".docx":
                return "application/ms-word";
        }
    }

Когда я его скомпилировал, я получил ошибку BaseClass.ReturnExtension(string)': not all code paths return a value .. Любое предложение ...

Ответы [ 8 ]

18 голосов
/ 20 апреля 2010

Вам необходимо добавить условие default, если вы возвращаетесь из оператора switch.

// As SLaks mentioned, you should be case in-sensitive.
// Therefore, I'm comparing only the Lower Case version of the extensio

switch(fileExtension.ToLowerInvariant())
{
    case ".doc":
    case ".docx":
        return "application/ms-word";
    default:
        // You could also throw an Exception here if unknown extensions
        // are truly invalid (which seems to be the more popular choice)
        //
        // Since it looks like you're returning a content-type for a
        // download, I would default to octet-stream so the user would
        // just get a download window.
        return "application/octet-stream";
}
17 голосов
/ 20 апреля 2010

Вы не указали, что должен возвращать метод, если fileExtension не равно ".doc" или ".docx". Вы можете сделать это, добавив регистр по умолчанию к оператору switch. Предполагая, что другие значения fileExtension недопустимы, вы должны сгенерировать исключение:

public string ReturnExtension(string fileExtension)
{
    switch (fileExtension)
    {
        case ".doc":
        case ".docx":
            return "application/ms-word";
        default:
            throw new ArgumentException(string.Format("Invalid fileExtension '{0}'.", fileExtension));
    }
}
4 голосов
/ 20 апреля 2010

Вам нужно значение по умолчанию или вам нужно вернуть что-то за пределами switch.

default:
        Console.WriteLine("Default case");
        return "";
3 голосов
/ 20 апреля 2010

Это одно из лучших сообщений об ошибках, которое может выдать компилятор. Это означает именно то, что: не все пути кода возвращают значение.

Путь кода создается с помощью операторов ветвления, таких как while, if и switch.

Компилятор пытается гарантировать, что всякий раз, когда среда выполнения выполняет эту функцию, будет возвращено значение указанного типа (здесь: string).

В вашем примере возвращаемое значение для fileextension, не входящего в набор (doc, docx), не определено. Вы можете либо

  • укажите предложение default в вашем switch утверждении
  • или добавьте оператор catch-all return в конце вашего метода (return "text/plain"?)
1 голос
/ 20 апреля 2010

Вам нужны default и break или break в вашем последнем выписке.

1 голос
/ 20 апреля 2010

Спросите себя, что происходит, когда fileExtension равен .xls. Вы должны вернуть что-то в default-case или просто после оператора switch:

public string ReturnExtension(string fileExtension)
{
    switch (fileExtension)
    {
        case ".doc":
        case ".docx":
            return "application/ms-word";
    }
    return "unknown";  // this path wasn't returning anything
}
1 голос
/ 20 апреля 2010

Компилятор получает контрольный поток из нашего источника и видит, что не все пути покрыты, например, если вы передаете fileExtension ".rtf", эта функция не может обеспечить возвращаемое значение. 1003 *

Так что либо предоставьте возвращаемое «что-то» в конце функции, либо просто сгенерируйте исключение для случая «default:» коммутатора. Вы должны решить, что должна делать функция в тех случаях, когда она не видит ни «.doc», ни «.docx».

0 голосов
/ 20 апреля 2010

Только мои 0,10 доллара, вполне понятно, что здесь возвращается заголовок контента, поэтому, если мы не распознаем расширение файла, а не генерируем исключения или неверную информацию заголовка MIME (например, «неизвестно»), мы должны вернуть файл в браузер в виде потока октетов, например:

public string ReturnExtension(string fileExtension)
{
    switch (fileExtension)
    {
        case ".doc":
        case ".docx":
            return "application/ms-word";
        default:
            return "application/octet-stream";
    }
}

Таким образом, мы можем приспособиться к сценариям, когда через 5 лет M $ выпускает MS-Word v30.1, а расширение становится «.docz», система не будет генерировать исключения, а будет вызывать MS-Word (подробнее) изящно, хотя и не использует расширенное поведение IE, что "application / ms-word" будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...