Не Дополнительные Методы C# позволяют передающие параметры ссылкой?

Я использую несколько буферов, которые установлены скрытые в моем ~/.vimrc файл.

мини-буферный сценарий проводника хорош также получить хороший компактный список Ваших буферов. Тогда :b1 или :b2..., чтобы перейти к соответствующему буферу или использовать мини-буферный проводник и вкладку через буферы.

22
задан Jakob Gade 11 August 2009 в 08:43
поделиться

3 ответа

Нет. В C # вы не можете указать какие-либо модификаторы (например, 'out' или ref ), кроме this для первого параметра метода расширения - вы можете для другие. Не знаком с синтаксисом VB, но, похоже, он использует декларативный подход для обозначения метода расширения.

Когда вы вызываете его, вы не указываете первый this ] параметр. Следовательно, маркировка параметра как out или ref не имеет смысла, поскольку вы не можете указать модификатор при его вызове, как это делали бы для обычных методов

void MyInstanceMethod(ref SomeClass c, int data) { ... } // definition

obj.MyInstanceMethod(ref someClassObj, 10);              // call

void MyExtensionMethod(this SomeClass c, int data) {.... } // defn

c.MyExtensionMethod(10);                                 // call

Я думаю, что проблема, с которой вы здесь столкнулись, связана с неизменяемыми типами значений . Если бы будние дни были эталонным типом, все бы хорошо. Для неизменяемых типов (структур) Фактически способ - вернуть новый экземпляр с требуемым значением. Например, см. Метод Add в структуре DateTime, он возвращает новый экземпляр DateTime, значение которого = значение экземпляра DateTime получателя + значение параметра.

public DateTime Add( TimeSpan value )
13
ответ дан 29 November 2019 в 05:24
поделиться

Ура - вы создаете изменяемую неизменяемую структуру. Это нарушает то, что люди ожидают увидеть в C #, но при необходимости вы всегда можете напрямую вызвать метод:

Ext.Add(ref value, arg1);

Любой метод расширения может быть вызван напрямую.

Также пояснение:

SomeReferenceType value = ...;
SomeReferenceType copy = value;
value.ExtensionMethodByRef(...);
// this failing is semantically ridiculous for reference types, which
// is why it makes no sense to pass a `this` parameter by ref.
object.ReferenceEquals(value, copy);
11
ответ дан 29 November 2019 в 05:24
поделиться

Странно, что VB.NET позволяет это, а C # - нет ...

Однако, хотя это может иметь смысл с технической точки зрения (поскольку метод расширения - это просто статический method), я думаю, что это неправильно, потому что методы расширения используются, как если бы они были методами экземпляра, а методы экземпляра не могут изменять ссылку this .

4
ответ дан 29 November 2019 в 05:24
поделиться