My version of explanation comes from using properties to help understand the differences.
override is simple enough, right ? The underlying type overrides the parent's.
new is perhaps the misleading (for me it was). With properties it's easier to understand:
public class Foo
public bool GetSomething => false;
public class Bar : Foo
public new bool GetSomething => true;
public static void Main(string args)
Foo foo = new Bar();
Bar bar = new Bar();
Using a debugger you can notice that
Foo foo has 2
GetSomething properties, as it actually has 2 versions of the property,
Bar's, and to know which one to use, c# "picks" the property for the current type.
If you wanted to use the Bar's version, you would have used override or use
Foo foo instead.
Bar bar has only 1, as it wants completely new behavior for