【C#】C#のバージョンによりPath.GetDirectoryの結果が違って困った話

C#のバージョンによりPath.GetDirectoryの結果が違って困ったので現象をまとめておきます。

現象

まず前提として、C#のパスシステムはPath.DirectorySeparatorCharと
Path.AltDirectorySeparatorCharの両方をディレクトリの区切り文字として認識します。

light11.hatenadiary.com

そのため下記のように二つの区切り文字が混在していても正常にパスとして認識してくれます。

var path = @"Path/To/File\Example/example.ex";

ただ、このようなパスに対してPath.GetDirectoryName()を使った時だけ、C#のバージョンにより挙動が異なります。
古いバージョンだとAltDirectorySeparatorCharがそのまま出力されるのに対し、
新しいバージョンだとAltDirectorySeparatorCharがDirectorySeparatorCharに変換されて出力されます。

var path = @"Path/To/File\Example/example.ex";

// 古いバージョンだとAltDirectorySeparatorCharがそのまま : Path/To/File\Example/example.ex
// 新しいバージョンだとAltDirectorySeparatorCharがDirectorySeparatorCharに変換される : Path\To\File\Example\example.ex
System.Console.WriteLine(Path.GetDirectoryName(path));

Path.GetFullPath()の結果はすべてDirectorySeparatorCharに変換されるので、
古いバージョンにおけるPath.GetDirectoryName()の挙動だけがおかしかったのかなと思います。

// こっちは全部DirectorySeparatorCharに変換される
System.Console.WriteLine(Path.GetFullPath(path));

具体的にどのバージョン?

Unityで確認したため具体的にC#のどのバージョンからこの修正が入ったのかはわかりませんが、
.NET 3.5環境が本記事でいうところの「古い環境」で.Net4.6環境が本記事でいうところの「新しい環境」です。

関連

light11.hatenadiary.com