Let's say we have this base class:class MyBase{    public string Name { get; set; }    public string GetDescription()    {        var descriptionList = new List<string>() { this.Name };        descriptionList.AddRange(this.ExtraDescriptions.ToList());        return string.Join(, , descriptionList();    }    protected virtual IEnumerable<string> ExtraDescriptions()    {        return new List<string>();    }}Then add a derived class:class MyDerived : MyBase{    protected override IEnumerable<string> ExtraDescriptions()    {        return new List<string>() { a, b };    }}It seems to me that this violates the LSP (because we're changing the behavior of the GetDescription method), and yet it's also a fundamental feature of object-oriented programming.  The base class obviously declares its intention to allow the ExtraDescriptions method to be overridden, but this isn't necessarily visible to a consumer of the class.Ever since I learned about the LSP, this problem has really been gnawing at me.  So:Does this violate LSP?What's the correct alternative to this?
Does calling a virtual protected method from a base class violate the LSP?
solid;liskov substitution
LSP only requires that a property of a super-class be true of all its derivatives. By property, in this context, we mean that it will supply a list of descriptions. The implementation of that is irrelevant.As far as I can see, there is no violation in your case.Properties in LSP are much more about the assumptions that can be made by the calling code than they are about the implementation of functionality, or even behaviour.The canonical example is a square is a specialised rectangle. But rectangles have height and width properties, which calling code may assume are independent of each other. While a square only really has one dimension, so if I say rect.X = 3; rect.Y = 2; and the object is a rectangle, I get a 3x2 rectangle; but with the same calling code on a square, I get a 2x2 rectangle.