Передача явного броска как касательно параметра (C#)

У меня есть класс, который является главным образом оберткой для большого массива и некоторого связанного обслуживания. У меня есть функция, которая берет касательно параметра. Когда я передаю экземпляр класса в функцию, я хочу, чтобы массив был отправлен.

Я рассмотрел явные броски. Скажем, у меня есть некоторая функция, которая имеет байт [] касательно параметра.

    public void SomeFunction(ref byte[] someBytes);

И это у меня есть некоторый класс с перегруженным явным броском.

    class SomeClass
    {
        byte[] someBytes;
        public static explicit operator byte[](SomeClass someInstance)
        {
            return someInstance.someBytes;
        }
    }

Теперь я хочу вызвать функцию с классом в качестве параметра

    SomeClass someInstance = new SomeClass();
    SomeFunction(ref (byte[]) someInstance);

Компилятор жалуется "касательно, или аргументом должна быть присваиваемая переменная". Я не уверен, не удается ли мне просто массажировать компилятор правильно или если Вы действительно просто не можете сделать этого.

Я рассмотрел Свойство или функциональное возвращаемое значение, но Вы не можете пройти мимо тех, которые касательно (и после обучения меня я вижу почему...),

Я предпочел бы не делать массив общедоступным полем, но это действительно удовлетворяет компилятор. Я предполагаю, что мог просто создать локальную переменную для ссылки на массив с, но это - дополнительная строка кода прежде и после каждого вызова функции...

Править: могло бы стоить отметить, что SomeFunction был записан третьим лицом, и у меня нет доступа для изменения его. Хуже, я не думаю, что их параметр на самом деле должен быть касательно...

9
задан ajs410 29 January 2010 в 23:24
поделиться

3 ответа

Присваивание не является присваиваемой переменной; Вы передаете возвращаемое значение от Вашего оператора явного приведения.

Вы можете создать переменную, содержащую правильное приведенное значение, перед передачей в виде ссылки:

SomeClass someInstance = new SomeClass();
byte[] someBytes = (byte[])someInstance;
SomeFunction(ref someBytes);

Обратите внимание, что теперь это переменная someBytes, которая может быть переназначена. Вы должны будете предпринять действия по переназначению someInstance.someBytes каким-то образом после вызова SomeFunction, если вы хотите, чтобы внутреннее значение someInstance было переназначено.

9
ответ дан 4 December 2019 в 20:23
поделиться

Вид. Учитывая класс A:

A a;
...
a = A();   

последний оператор не является инициализацией, это назначение, но он, вероятно, делает то, что вы хотите.

-121--983330-

Краткий ответ:

No. Если часть предполагаемого поведения объекта должна быть инициализирована несколько раз, то наилучшим путем для реализации этого является доступный метод инициализации. Конструктор класса может просто отложить этот метод.

class C1 {
public:
  C1(int p1, int p2) {
    Init(p1,p2);
  }
  void Init(int p1, int p2) { ... }
};

Уголок Nitpicker:

Существует ли какой-то невероятно злой способ вызова конструктора в C++ после создания объекта? Почти наверняка это С++ в конце концов. Но это в корне зло и его поведение почти наверняка не определено стандартом и его следует избегать.

-121--983334-

Объем значений, которые могут использоваться в качестве ссылочного параметра в C #, ограничен разрешениями CLR. Он указан в спецификации CLI в разделах 12,4,1,5,2 и 12,1,6,1 и включает

  • Аргумент текущего метода
  • Локальная переменная
  • Членов Поле объекта
  • Статическое поле
  • Элемент массива

Приведение не соответствует ни одному из них и поэтому не может использоваться в качестве значения ref . Перед передачей по ссылке его необходимо присвоить значению, подобному локальному.

1
ответ дан 4 December 2019 в 20:23
поделиться

Это невозможно, сначала нужно материализовать результат преобразования объекта в переменную.

Рассмотрим следующий код, если то, что вы просите, разрешено:

public void SomeFunction(ref byte[] someBytes)
{
    someBytes = new byte[] { 1, 2, 3 };
}

SomeClass someInstance = new SomeClass();
SomeFunction(ref (byte[]) someInstance);
// uh-oh, what is "someInstance" now?

Почему аргумент помечен как "ref", какую проблему вы пытаетесь здесь решить?

1
ответ дан 4 December 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: