2012-06-06 2 views
1

У меня есть этот кодC# Cast массив сопрягаемых Reference перед отправкой

public MyResponse innerFunc(ref MyElem[]); 
public IResponse myFunc(ref IElem[] myElem) 
{ 
    return this.innerFunc(ref (A_CAST_OR_SOMETHING) myElem); 
} 

Где

  • MyResponse: IResponse
  • MyElem: IElem
  • A_CAST_OR_SOMETHING должен быть MyElem []

Когда я это делаю

public IResponse myFunc(ref IElem[] myElem) 
{ 
    return this.innerFunc(ref ((MyElem[]) myElem)); 
} 

В Higlights компилятор скобок (только скобки) и сказать:

реф или из аргументов должен быть назначаемым переменной

Что я должен быть делать?

ответ

2

Способ работы ref и out, то, что вы передаете в качестве этого параметра, должно быть назначено напрямую. Короче говоря, он должен иметь возможность появиться слева от знака =. Так как вы не можете сделать это:

((MyElem[])myElem) = foo; 

тогда вы не можете сделать это:

foo((MyElem[])myElem); 

Чтобы это исправить, необходимо ввести временную переменную:

public IResponse myFunc(ref IElem[] myElem) 
{ 
    var temp = (MyElem[])myElem; 
    var response = this.innerFunc(ref temp); 

    myElem = (IElem[])temp; 
    return response; 
} 
+0

'System.InvalidCastException: невозможно сбрасывать объект типа« IElem [] »для ввода« MyElem [] ». at MyClass.myFunc (ref IElem [] myElem) ' – apacay

+0

Является ли' MyElem' строковым типом или типом класса? Я был уверен, что вы можете создавать массивы классов в обоих направлениях ... –

+0

это класс. Я тоже так думал. – apacay

2

Вы не можете бросить ref параметры , Тип параметра должен точно соответствовать. Таким образом, в этой позиции не допускаются операторы литья. Можно было бы создать соответствующий переменную перед вызовом innerFunc:

public IResponse myFunc(ref IElem[] myElem) 
{ 
    MyElem[] p = (MyElem[])myElem; 
    var result = this.innerFunc(ref p); 
    myElem = p; 
    return result; 
} 

Это работает, если фактический тип параметра является MyElem[]. Если это всего лишь IElem[], вам нужно создать отдельный массив.

+0

'System.InvalidCastException: Невозможно передать объект типа« IElem [] »для ввода« MyElem [] ». at MyClass.myFunc (ref IElem [] myElem) ' – apacay

+0

@Michael, Botz, Может ли быть, что я вынужден отбрасывать 1 на 1 каждый элемент массива? – apacay

+1

@apacay Если вы передадите фактический IElem [], тогда да. Вам нужно будет создать копию массива с другим типом в обоих направлениях. Но опять же, возможно, вам стоит пересмотреть свой дизайн. Зачем вам нужно передать параметр ref? Без ссылки ref вы также передаете ссылку на тот же объект, вам нужен только ref, если вы действительно хотите изменить объект, на который ссылается ссылка. – Botz3000