Swap(): свойство или индексатор не могут передаваться как параметр out или ref
Альтернативный заголовок: Как правильно сделать Swap(Array[i],Array[j])?
Есть универсальный метод Swap
public static void swap<T>(ref T a, ref T b)
{
T c = a;
a = b;
b = c;
}
И я пытаюсь использовать его так:
List<MyClass> Parent0;
//...
for (int p = 0; p < 2; p++)
{
while (Mutated[p].Count>1)
{
swap(ref Parent0[Mutated[p].Pop()], ref Parent0[Mutated[p].Pop()]); //Pop() возвращает int
}
}
//...
Но компилятор выдаёт ошибку. Как сделать Swap(a,b) в таком случае? Mutated[p].Pop() разный при каждом вызове, поэтому я не могу использовать (а,b) = (b,а), не объявляя дополнительных переменных (да и такая запись сильно удлиняет код и делает его менее понятным, чем Swap(a,b))
Ответы (1 шт):
Все верно, вы не можете индексатор списка и любой другой коллекции (кроме массива) получить по ref. Так как индексатор коллекции технически - это метод, возвращающий значение нужного типа, а не поле и не переменная. (индексатор массива - не метод, это компонент для вычисления смещения в памяти относительно начала данных, уможаемый на длину каждой ячейки данных в байтах, его можно использовать по ref)
Создайте перегрузку метода Swap. Кстати, называйте в C# методы с большой буквы, так код легче читать.
public static void Swap<T>(IList<T> list, int aIndex, int bIndex)
{
T value = list[aIndex];
list[aIndex] = list[bIndex];
list[bIndex] = value;
}
Использовать можно так
public class MyClass
{
public int Index { get; set; }
public override string ToString()
{
return Index.ToString();
}
}
static void Main(string[] args)
{
List<MyClass> list = new List<MyClass>
{
new MyClass { Index = 1 },
new MyClass { Index = 2 }
};
Console.WriteLine(string.Join(", ", list));
Swap(list, 0, 1);
Console.WriteLine(string.Join(", ", list));
Console.ReadKey();
}
Вывод в консоль
1, 2
2, 1
В вашем случае будет выглядеть так
Swap(Parent0, Mutated[p].Pop(), Mutated[p].Pop());