この記事はさいたまげーむす Advent Calendar 2016 4日目の記事です。
UnityというよりはC#ですが…
string配列の0番目を除いた1番目以降を可変長引数のメソッドに渡し、それぞれの型を復元したいケースがありました。
このとき、一度 List<object>に入れてから渡してしまうと、渡した先でstringへのキャストに失敗してしまうようです。
void Method1()
{
string line = GetLine();
var items = line.Split('\t');
List<object> objects = new List<object>();
for(int i = 1; i < items.Length; i++)
{
objects.Add(items[i]);
}
Method2(objects);
}
void Method2(params object[] parameters)
{
}
本来はもともとstringだったものはobject型に格納されてもキャストすれば復元できるのですが、こうすると経由する過程で型情報が落ちてしまうのか、キャストに失敗します。
「俺は昔stringだった…。だがその記憶はもう失われてしまった…。今の俺はただのobjectさ。」
LINQを使い、line.Skip(1).ToArray();とすることで解決しました。こうするとobjectを経由するのは引数に渡される1回のみですむためか大丈夫なようです。
というかそもそも自分のケースの場合、可変長引数である必要すらなく、string[]で十分でした!(下らないオチ)
object型には気を付けよう!