|
2015/09/03(Thu) 15:19:07 編集(投稿者)
■No76987 (ミーアキャット さん) に返信 > どうしてでしょう? そもそも、 object[] o1 = new string[] { "AAA", "bbb", "CCC" }; string[] s1 = (string[])o1;
object[] o2 = new object[] { "aaa", "BBB", "ccc" }; string[] s2 = (string[])o2; の場合、s1 は成功しますが、s2 は失敗します。
今回の場合、olst は object[] ですが、中身は string[] ですから、 コピー無しで、単にキャストするだけならば可能です。
string[] ok = (string[])olst; // 上記 s1 と同じ理由で成功 string[] ng = (string[])olst.ToArray(); // 上記 s2 と同じ理由で失敗
なお、ToArray 拡張メソッドは、配列に対して用意されているわけではなく、 IEnumerable<T> に対して用意されたものです。
// ○これらはOK string[] ok1 = Enumerable.ToArray<string>((IEnumerable<string>)olst); string[] ok2 = ((IEnumerable<string>)olst).ToArray(); string[] ok3 = Enumerable.ToArray((dynamic)olst); string[] ok4 = (string[])olst.Clone();
// ★これらはNG // string[] ng1 = (string[])olst.ToArray(); // string[] ng2 = (string[])Enumerable.ToArray<object>(olst); // string[] ng3 = Enumerable.ToArray<string>(olst); // string[] ng4 = Enumerable.ToArray<dynamic>(olst); // string[] ng5 = Enumerable.ToArray((IEnumerable<dynamic>)olst); // string[] ng6 = Enumerable.ToArray<dynamic>((IEnumerable<dynamic>)olst); // string[] ng7 = Enumerable.ToArray<dynamic>((dynamic)olst); // string[] ng8 = (dynamic)olst.ToArray();
> コピーする方法はあるのでしょうか? C#2010 以降であれば、下記のようにすることで、 object[] → string[] へのコピーが行えます。
string[] newslst1 = Array.ConvertAll(olst, Convert.ToString);
string[] newslst2 = olst.Cast<string>().ToArray();
string[] newslst3 = new string[olst.GetLength(0)]; olst.CopyTo(newslst3, 0);
https://support.microsoft.com/ja-jp/kb/312390
------- newslst1 を C#2005/C#2008 環境で利用する場合は、 string[] newslst1 = Array.ConvertAll<object, string>(olst, Convert.ToString); に変更してください。
newlst2 は C#2008 でも動作します。 (2005 以下は、そもそも匿名メソッドを使えないため NG ですが)
newslst3 は、2002/2003 を含むすべてのバージョンで動くと思いますが、 こちらでは未検証です。(少なくとも 2005 以降であれば OK です)
|