に記述すると暗黙のキャストでコードを記述するとCS0266が生成されます。明示的なキャストは存在しますが、Dictionary <int、string []>をIDictionary <int、IEnumerable <string>>
Dictionary<Int32, string[]> d1 = new Dictionary<int, string[]>();
IDictionary<int, IEnumerable<string>> ide1 = d1; // CS0266
明示的なキャストが存在することは、明示的なキャストによって問題が解決されることを示しています。
IDictionary<int, IEnumerable<string>> ide1 = (IDictionary<int, IEnumerable<string>>)d1; // No error, but throws an exception
このキャストを行う方法はありますか?それはstring[][]
とIEnumerable<IEnumerable<string>>
で動作しますか?
namespace Quickie
{
class QuickieArray
{
private static void TestCastDictionaryWithArrayValue()
{
Console.WriteLine();
Console.WriteLine("===TestCastDictionaryWithArrayValue===");
Dictionary<Int32, string[]> d1 = new Dictionary<int, string[]>();
d1[1] = new string[]{"foo"};
IDictionary<int, string[]> id1 = d1;
Console.WriteLine("id1 is null: {0}", id1 == null);
IDictionary<int, IEnumerable<string>> ide1 = id1 as IDictionary<int, IEnumerable<string>>;
IDictionary<int, IEnumerator<string>> iden1 = id1 as IDictionary<int, IEnumerator<string>>;
Console.WriteLine("ide1 is null: {0}", ide1 == null);
Console.WriteLine("iden1 is null: {0}", iden1 == null);
Console.WriteLine();
}
internal static void Test()
{
Console.WriteLine();
Console.WriteLine("=QuickieArray=");
TestCastDictionaryWithArrayValue();
}
}
}
出力:
=== === TestCastDictionaryWithArrayValue
ID1がnull:偽
IDE1がnull:真
iden1がnull:真
クイックメモ: 'System.Int32'と' int'は同じ型です。 C#では、後者は前者の別名です。 (もちろん 'id1'は' null'ではありません。) – dlev
明示的なキャストの合法性についてもう少し詳しく知りたい場合は、別の質問に対する私の最近の回答に興味があるかもしれません。 http://stackoverflow.com/a/8402861/55943 – mquander