问题
Why do extension methods require the declaring class to be static? Is it a compiler requirement?
回答1:
It's dictated in the language specification, section 10.6.9 of the C# 4 spec:
When the first parameter of a method includes the this modifier, that method is said to be an extension method. Extension methods can only be declared in non-generic, non-nested static classes. The first parameter of an extension method can have no modifiers other than this, and the parameter type cannot be a pointer type.
It's not clear to me why all of these restrictions are necessary - other than potentially for compiler (and language spec) simplicity. I can see why it makes sense to restrict it to non-generic types, but I can't immediately see why they have to be non-nested and static. I suspect it makes the lookup rules considerably simpler if you don't have to worry about types contained within the current type etc, but I dare say it would be possible.
I suspect that the extra complexity of not having these restrictions was deemed less than the benefit gained.
EDIT: Just to be clear, I'm not suggesting that it would make sense to have instance methods as extension methods - I'm suggesting that it would make sense to have a static extension method in a nested and/or non-static class.
来源:https://stackoverflow.com/questions/2731695/extension-methods-require-declaring-class-to-be-static