I've set property Name is read only, but it can still be assigned.
class Person
{
    public string Name { get; }
    public Person(string name)
    {
        Name = name;
    }
}
Try to set value to property Name:
var p = new Person("Kevin");            
Console.WriteLine(p.Name); //output: Kevin
p.Name = "John"; //Property or indexer 'Person.Name' cannot be assigned to -- it is read only
Can you explain me why?
 
  
                     
                        
It can only be assigned in the constructor or in the initializer for the property declaration - just like a read-only field can only be assigned in the constructor or in the field initializer.
There won't be a property setter generated - the compiler will use a read-only field, and initialize it in the constructor. So the generated code will be broadly equivalent to:
class Person
{
    private readonly string _name;
    // Old school: public string Name { get { return _name; } }
    public string Name => _name; 
    public Person(string name)
    {
        _name = name;
    }
}
It's enormously useful to be able to do this, and I'm really glad it was added to C# 6.
 
                    See more on this question at Stackoverflow