Skip to content

How to Resolve Error "CS0650: Bad array declarator" in C#

Fix the C# compiler error CS0650 by correcting array syntax: learn why int[] (not int[] variable) is required and when to use fixed for unsafe fixed-size buffers.

The Compiler Error CS0650 is a syntax error that occurs when you declare an array using C or C++ style syntax. The message reads: "Bad array declarator: To declare a managed array the rank specifier precedes the variable's identifier."

In C and C++, it is common to put the square brackets after the variable name (e.g., int numbers[]). In C#, arrays are objects, and the brackets are considered part of the Type, not the variable name. Therefore, C# mandates that the brackets appear immediately after the data type (e.g., int[] numbers).

This guide explains the correct syntax for managed arrays and how to handle fixed-size buffers if that was your actual intent.

Understanding C# Array Syntax

C# treats arrays as distinct types derived from System.Array.

  • The Type: int[] (An array of integers).
  • The Variable: myArray.

When you write int myArray[], you are effectively splitting the type definition across the variable name, which C# forbids to keep the type system consistent.

Scenario 1: The C/C++ Style Declaration

This is the most common cause. A developer creates an array and habitually places the brackets after the identifier or attempts to specify the size on the left side of the assignment.

Example of error:

public class Program
{
    static void Main()
    {
        // ⛔️ Error CS0650: Bad array declarator.
        // The brackets [] are in the wrong place (after 'numbers').
        int numbers[]; 

        // ⛔️ Error CS0650: Also applies when trying to define size immediately.
        // C# does not allow 'int numbers[5]'.
        int scores[5];
    }
}

Solution 1: Move the Brackets (Managed Arrays)

To declare a standard .NET array (which is allocated on the Heap and managed by the Garbage Collector), place the brackets immediately after the type.

Solution:

public class Program
{
    static void Main()
    {
        // ✅ Correct: Brackets belong to the type 'int[]'.
        int[] numbers;

        // ✅ Correct: Allocation happens on the right side with 'new'.
        int[] scores = new int[5];
        
        // Example usage
        scores[0] = 100;
        System.Console.WriteLine(scores[0]);
    }
}

Solution 2: Use fixed (Unsafe Fixed-Size Buffers)

The error message also mentions: "To declare a fixed size buffer field, use the fixed keyword before the field type."

If you are doing Interop with C++ code and you genuinely need a C-style array (a fixed block of memory embedded directly inside a struct, not a reference to an object), you must use Unsafe Code and the fixed keyword. This creates a "Fixed Size Buffer".

Solution (Unsafe Context):

// Requires 'AllowUnsafeBlocks' in .csproj
public unsafe struct NativePacket
{
    // ✅ Correct: Declares a fixed buffer of 10 integers inline.
    // This looks like C syntax but requires the 'fixed' keyword.
    public fixed int DataBuffer[10]; 
}

public class Program
{
    static void Main()
    {
        unsafe
        {
            NativePacket packet = new NativePacket();
            packet.DataBuffer[0] = 255;
            System.Console.WriteLine(packet.DataBuffer[0]);
        }
    }
}

Conclusion

CS0650 is a syntax correction.

  1. Check the Brackets: Are they after the variable name (name[])?
  2. Move them: Move them to the type (type[] name).
  3. Check Initialization: Remember that size definition happens on the right side of the equals sign (= new int[5]), not on the left.
Navigation