Невозможный использовать касательно и для первого (“этот”) параметр в Дополнительных методах?

Почему запрещается звонить 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;
}

Но почему?

28
задан Saro Taşciyan 9 February 2014 в 11:08
поделиться

2 ответа

Вы должны явно указать ref и out. Как бы вы сделали это с помощью метода расширения? Более того, действительно ли вы хотите этого?

TestClass x = new TestClass();
(ref x).ChangeWithExtensionMethod(otherTestClass);
// And now x has changed?

Или вы хотите не указывать часть ref только для первого параметра в методах расширения?

Честно говоря, для меня это звучит странно и является рецептом нечитаемого (или, по крайней мере, труднопредсказуемого) кода.

21
ответ дан 28 November 2019 в 03:32
поделиться

Это означает, что вызов myObject.ChangeWithExtentionMethod(otherObject) может изменить значение myObject. IMO, это не очень читабельный код, когда вы можете достичь желаемого эффекта, используя обычный нерасширенный метод с ссылкой.

EDIT: Я хочу сказать, что вызов метода должен требовать использования ключевого слова ref в любом случае, когда вы передаете что-то по ссылке. Использование ref с параметром 'this' метода расширения будет нарушать это поведение.

1
ответ дан 28 November 2019 в 03:32
поделиться