Compiler error ยท error CS0161

'X': not all code paths return a value

The method signature promises a value: int, string, anything but void. But at least one path through the body reaches the closing brace without a return. C# will not invent a value for you.

See it happen

int Sign(int x)
{
    if (x > 0)
    {
        return 1;
    }
    // no return here โ€” what if x is 0 or negative?
}

The compiler is doing path analysis, not guessing. It sees exactly one return guarded by a condition, and asks the obvious question: what should this method produce when x is not greater than zero? Nothing says โ€” so it refuses to build.

Fix 1: add the missing branch

int Sign(int x)
{
    if (x > 0)
    {
        return 1;
    }
    else
    {
        return -1;
    }
}

Console.WriteLine(Sign(-5));
Console.WriteLine(Sign(5));

Fix 2: a final return after the if

Often cleaner โ€” the early return handles the special case, and one final return covers everything else:

int Sign(int x)
{
    if (x > 0) return 1;    // early exit for the special case
    if (x == 0) return 0;
    return -1;              // every path below is now covered
}

Console.WriteLine(Sign(7));
Console.WriteLine(Sign(0));
Console.WriteLine(Sign(-3));

Fix 3: switch needs a returning default

Same rule, different shape โ€” every case must return, and a default must exist and return, or the compiler cannot prove coverage:

int Apply(char op, int a, int b)
{
    switch (op)
    {
        case '+':
            return a + b;
        case '*':
            return a * b;
        default:
            throw new Exception("unknown operator");   // throw also counts as leaving
    }
}

Console.WriteLine(Apply('*', 2, 4));

Fix 4 (sometimes better): make it void

If the method genuinely has nothing to return, the signature is lying. Change int to void and print inside โ€” then no return is required at all:

void DescribeSign(int x)
{
    if (x > 0)
    {
        Console.WriteLine("positive");
        return;              // optional early exit; no value needed
    }
    Console.WriteLine("zero or negative");
}

DescribeSign(9);

Why so strict?

If C# allowed this, every call site would need to ask "did it actually return something?" at runtime โ€” and there would be no sensible answer. Languages that return "undefined" or garbage here are the reason entire bug classes exist. C# pushes the problem back to the author: say what the value is on every path.

Frequently asked

How do I fix error CS0161 in C#?

Give every path a return: an else branch, a final return after the if, a default that returns (or throws) in a switch, or change the return type to void if there is truly nothing to return. An if without else is never enough on its own.

Why doesn't one if with a return satisfy it?

The compiler checks every path, not just the ones you tested. When the condition is false, control reaches the end of the method with no value โ€” add an else or a trailing return to close that path.

Checklist