Skip to content

How to Resolve Error "CS1007: Property accessor already defined" in C#

Fix the C# compiler error CS1007 by identifying and resolving duplicate property accessors (get, set, or init) in your code.

The Compiler Error CS1007 is a syntax error regarding Properties. The message reads: "Property accessor already defined".

In C#, a property can encapsulate data access using specific keywords: get, set, and (in C# 9+) init. The rule is simple: a property can have at most one of each type of accessor. You cannot define two getters or two setters for the same property. This error occurs when the compiler finds a duplicate keyword within the property's code block.

This guide explains how these duplications occur and how to clean up your property definitions.

Understanding Property Accessors

A standard property looks like this:

public int MyProperty
{
    get { return _myField; }  // Reads data
    set { _myField = value; } // Writes data
}

The compiler uses the keywords get and set to generate methods (get_MyProperty and set_MyProperty). If you define get twice, the compiler tries to generate two methods with the exact same name, which is impossible.

Scenario 1: Duplicate Keywords (Copy-Paste Errors)

This is the most common cause. When manually implementing a property (expanding it from an auto-property), it is easy to copy the get block to create the set block but forget to change the keyword to set.

Example of error

Here, the developer intended to write a setter, but accidentally wrote get a second time.

public class User
{
    private string _name;

    public string Name
    {
        // First Getter
        get { return _name; }

        // ⛔️ Error CS1007: Property accessor already defined.
        // You cannot have a second 'get'. This should probably be 'set'.
        get { _name = value; } 
    }
}

Solution

Identify the duplicate block and rename the keyword to set (or remove the block if it was accidental).

public class User
{
    private string _name;

    public string Name
    {
        // ✅ Correct: One getter, one setter.
        get { return _name; }
        set { _name = value; } 
    }
}

Scenario 2: Mixing Expression-Bodied and Block Syntax

C# allows "Expression-Bodied Members" (=>) for concise syntax. However, you cannot define an accessor using the arrow syntax and also define it using the block syntax { } in the same property.

Example of error

Trying to use both styles simultaneously for the same accessor.

public class ScoreKeeper
{
    private int _score;

    public int Score
    {
        // Expression-bodied getter
        get => _score;

        // ⛔️ Error CS1007: Property accessor already defined.
        // The compiler sees this as a second getter definition.
        get { return _score; } 
        
        set { _score = value; }
    }
}

Solution

Choose one style and stick to it for that specific accessor.

public class ScoreKeeper
{
    private int _score;

    public int Score
    {
        // ✅ Correct: Only one definition for 'get'.
        get => _score;
        set => _score = value;
    }
}

Scenario 3: Conflict Between set and init

Introduced in C# 9.0, the init accessor is a specialized version of set that only allows assignment during object initialization. Since init is technically a setter (with extra rules), you cannot have both set and init on the same property. They are mutually exclusive.

Example of error

public class Configuration
{
    public string Environment
    {
        get;
        
        // Standard Setter
        set; 
        
        // ⛔️ Error CS1007: Property accessor already defined.
        // 'init' counts as a setter. You must choose one or the other.
        init; 
    }
}

Solution

Decide on the mutability of your property.

  • Use set if the value can change at any time.
  • Use init if the value should be immutable after creation.
public class Configuration
{
    public string Environment
    {
        get;
        // ✅ Correct: Chose 'init' for immutability.
        init; 
    }
}

Conclusion

CS1007 ensures that a property has a clear, unambiguous definition.

  1. Check for Typos: Look for two get keywords or two set keywords.
  2. Check Syntax: Ensure you aren't defining the same accessor twice using different syntax styles (=> vs { }).
  3. Check init: Remember that init replaces set; you cannot have both.
Navigation