1. ホーム
  2. c#

[解決済み] xからyへの共変数配列変換で実行時例外が発生することがある

2022-04-28 07:20:36

質問

私は private readonly のリスト LinkLabel s ( IList<LinkLabel> ). 私は後で LinkLabel のラベルをこのリストに追加し、それらのラベルを FlowLayoutPanel を以下のように設定します。

foreach(var s in strings)
{
    _list.Add(new LinkLabel{Text=s});
}

flPanel.Controls.AddRange(_list.ToArray());

Resharperが警告を表示した。 Co-variant array conversion from LinkLabel[] to Control[] can cause run-time exception on write operation .

解るようにお願いします。

  1. これはどういう意味ですか?
  2. これはユーザーコントロールであり、ラベルを設定するために複数のオブジェクトからアクセスされることはありません。 そのため、このようなコードにしておいても影響はありません。

どのように解決するのですか?

これはどういうことかというと

Control[] controls = new LinkLabel[10]; // compile time legal
controls[0] = new TextBox(); // compile time legal, runtime exception

また、より一般的な用語として

string[] array = new string[10];
object[] objs = array; // legal at compile time
objs[0] = new Foo(); // again legal, with runtime exception

C#では、オブジェクトの配列(この場合はLinkLabels)を基本型の配列として参照することが許されています(この場合はControlsの配列として)。また、コンパイル時に 別の オブジェクトである Control を配列に追加します。問題は、配列の は実際にはControlsの配列ではありません。 実行時、それはまだLinkLabelsの配列である。そのため、代入や書き込みを行うと、例外が発生します。