8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Array.Empty<T> メソッドが見つからない例外が発生する罠

Last updated at Posted at 2018-08-17

実際に業務で発生した事例ですが、レアケースなのか日本語情報が無いため
初投稿の練習と覚書も兼ねて共有します。

#古い .NET Framework でも動くようにした
経緯としては、担当しているパッケージシステムが元々 .NET 4.5.1 をターゲットにしていたところを
Microsoft のサポート終了に伴い .NET 4.6.2 に変更。
しかし複数の客先に納品しているため、一部運用環境では .NET 4.5.1(or 4.5.2) のまま稼働していました。

.NET アプリはビルド時のターゲットより新しいバージョンの環境では基本的にそのまま動作しますが、
古いバージョンの環境で動かそうとするとApp.configにsupportedRuntimeを記述する必要があります。

当然、動作させたい最低バージョンでサポートされるクラスやメソッドしか使えませんが、
それを意識したコードを書いていても実際に動かすと例外が発生するのです。

#コンパイラが地雷を仕込んできた件
結論から言うと、可変長引数(params)を省略した際にコンパイラが .NET 4.6 以降でしか使えない
Array.Empty<T>メソッドで補完していることが原因でした。

いくら自分で書いたコードを眺めても原因が判明しないわけです…

#対策
自前で可変長引数なメソッドを定義する場合は可変長引数を持たないオーバーロードも
用意しておくことで使う側は特に意識する必要がなくなります。

それ以外の場合で引数なしオーバーロードも無い場合は、面倒ですが引数に
new string[0]のように空の配列を明示的に指定するしかありません。
(nullを渡すのは危険)

string.FormatメソッドStringBuilder.AppendFormatメソッドなどの
フォーマット系は引数を省略するような使い方はほぼしないと思いますが、
文字列のTrimStartメソッド/TrimEndメソッドTrimメソッドと同じような
使い方をすることが多いのに引数なしのオーバーロードがありませんので要注意です。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?