Возможно ли расширение статических классов с помощью методов расширения в .NET 4.0+? - PullRequest
5 голосов
/ 09 ноября 2011

Я читал, что возможно расширить статические классы в F #, хотя это еще не было возможно в C #. Предлагается несколько обходных путей, и поэтому предполагается, что этот тип расширения может быть достаточно полезным.

Хотя методы расширения определены как статические, они работают с расширяемыми экземплярами типов.

Поскольку ничто не позволяет мне думать, что оно теперь доступно, мне было интересно, сделана ли теперь такая возможность выполнимой для расширения статического класса с использованием синтаксиса методов расширения в C # в .NET 4.0 +?

1 Ответ

3 голосов
/ 09 ноября 2011

Дополнение статических классов методами расширения, вероятно, не будет возможно в 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 повсюду.

...