Start here. This is the direct spoken answer to practice first.
Why this question matters
Extension-call syntax looks like instance dispatch, but the compiler resolves a static method. That distinction matters when receiver types, namespaces, or library versions change.
An extension method is a static method made available through instance-like syntax when its namespace is in scope and the receiver can bind to the first parameter. Resolution uses the receiver's compile-time type and normal overload rules; it is not virtual dispatch. An applicable instance member takes precedence over extension methods. If a library later adds an instance method with the same name and compatible arguments, recompiled source may bind to the new instance member instead of the extension.