Почему запрещается звонить Extension Method
с ref
модификатор?
Этот возможен:
public static void Change(ref TestClass testClass, TestClass testClass2)
{
testClass = testClass2;
}
И этот нет:
public static void ChangeWithExtensionMethod(this ref TestClass testClass, TestClass testClass2)
{
testClass = testClass2;
}
Но почему?
Вы должны явно указать ref
и out
. Как бы вы сделали это с помощью метода расширения? Более того, действительно ли вы хотите этого?
TestClass x = new TestClass();
(ref x).ChangeWithExtensionMethod(otherTestClass);
// And now x has changed?
Или вы хотите не указывать часть ref
только для первого параметра в методах расширения?
Честно говоря, для меня это звучит странно и является рецептом нечитаемого (или, по крайней мере, труднопредсказуемого) кода.
Это означает, что вызов myObject.ChangeWithExtentionMethod(otherObject)
может изменить значение myObject
. IMO, это не очень читабельный код, когда вы можете достичь желаемого эффекта, используя обычный нерасширенный метод с ссылкой.
EDIT: Я хочу сказать, что вызов метода должен требовать использования ключевого слова ref в любом случае, когда вы передаете что-то по ссылке. Использование ref с параметром 'this' метода расширения будет нарушать это поведение.