Дополнение статических классов методами расширения, вероятно, не будет возможно в C # в разумном будущем, если язык не изменит способ объявления методов расширения.
Представьте, что мы должны добавить эту функцию в язык.Методы расширения в настоящее время определены как статические методы, принимающие дополнительный параметр, украшенный ключевым словом this
:
public class Foo
{
}
public static class ExtensionMethods
{
public static void ExtendFoo(this Foo foo, string bar)
{
}
}
. В приведенном выше коде декоратор this
- это единственное, что указывает компилятору обрабатывать ExtendFoo()
как метод расширения, который увеличивает класс Foo
.Другими словами, мы не можем избавиться от параметра foo
, который будет ссылаться на экземпляр Foo
, к которому будет применяться метод расширения, то есть эквивалент this
, если метод был собственнымдо Foo
.Проблема в том, что статические классы не могут быть созданы, поэтому что мы собираемся передать в этом параметре?
Мы можем устранить проблему и принять решение, что если Foo
является статическим, то компилятор должен выдавать код, который передаетnull
вместо действительного экземпляра Foo
(который все равно не может существовать).Но это было бы очевидным препятствием, и, вероятно, не должно быть частью языка только по этой причине.В противном случае ожидайте NullReferenceExceptions
повсюду.