У меня есть класс, который является главным образом оберткой для большого массива и некоторого связанного обслуживания. У меня есть функция, которая берет касательно параметра. Когда я передаю экземпляр класса в функцию, я хочу, чтобы массив был отправлен.
Я рассмотрел явные броски. Скажем, у меня есть некоторая функция, которая имеет байт [] касательно параметра.
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 был записан третьим лицом, и у меня нет доступа для изменения его. Хуже, я не думаю, что их параметр на самом деле должен быть касательно...
Присваивание не является присваиваемой переменной; Вы передаете возвращаемое значение от Вашего оператора явного приведения.
Вы можете создать переменную, содержащую правильное приведенное значение, перед передачей в виде ссылки:
SomeClass someInstance = new SomeClass();
byte[] someBytes = (byte[])someInstance;
SomeFunction(ref someBytes);
Обратите внимание, что теперь это переменная someBytes
, которая может быть переназначена. Вы должны будете предпринять действия по переназначению someInstance.someBytes
каким-то образом после вызова SomeFunction
, если вы хотите, чтобы внутреннее значение someInstance
было переназначено.
Вид. Учитывая класс 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
. Перед передачей по ссылке его необходимо присвоить значению, подобному локальному.
Это невозможно, сначала нужно материализовать результат преобразования объекта в переменную.
Рассмотрим следующий код, если то, что вы просите, разрешено:
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", какую проблему вы пытаетесь здесь решить?