Технически вы можете хранить в списке коллекцию чего угодно: строки, структуры, класса, кортежа..
//использовать структуру из примера Романа
List<CoOrds> rabbits = new List<CoOrds>() { new CoOrds(1, 1), new CoOrds(5, 5) };
//или создать класс
public class Rabbit
{
public int CoordX { get; set; }
public int CoordY { get; set; }
}
//и использовать
List<Rabbit> rabbits = new List<Rabbit>() { new Rabbit() { CoordX = 1, CoordY = 1 }, new Rabbit() { CoordX = 5, CoordY = 5 } };
//или кортеж
List<Tuple<int, int>> rabbits = new List<Tuple<int, int>>() { new Tuple<int, int>(1, 1), new Tuple<int, int>(5, 5) };
Если все же необходимо работать со строками, хорошо бы использовать хотя бы метод Split по разделителю, чтобы избежать конкретно возникшей у вас ошибки (как ответил вам Александр Юдаков). В итоге у вас будет массив со значениями и возможность добавить проверки на то, что в вашей строке по заданному разделителю действительно два значения, к примеру. Ну и конечно же хотелось бы упомнятуть про наличие методов TryParse, которые позволяют не в слепую использовать данные, а убедиться, что они вообще конвертируются в нужный формат и прописать корректное поведение, если это не так.
string values[] = coord_rabbits[0].Split(':');
string xString = values[0];
string yString = values[1];
int x;
if (int.TryParse(xString, out x))
{
// xString корректно преобразовалось в int хранится в переменной x
}
else
{
// xString не удалось преобразовать
}
Когда координата "x" превысит 9, получится строка:
"10:4"
Соответственно, символ по индексу [2] будет ':', а не число.
Поэтому Convert.ToInt32 выбрасывает FormatException.
Рекомендую сделать, что советует Роман.