不具合? : new しようとすると TypeLoadException
どこから仕様でどこがバグなのか、まだはっきりとしていないのだが、Community Edition v1.2.1357(日本語/英語)および Professinal Edition v1.2.1357(日本語)では、一部のアセンブリプライベートなクラスや構造体の初期化が Renaming を有効にすると TypeLoadException になってしまった。
// 公開する操作群をまとめるインターフェス public interface Ixxx { void DoIt(); } // Ixxx の実装その1 internal sealed class Xxx1 : Ixxx { // 実装 } // Ixxx の実装その2 internal sealed class Xxx2 : Ixxx { // 実装 } // Ixxx の実装その3 internal struct Xxx3 : Ixxx { // この部分が .cctor() で実行される時に TypeLoadException static readonly Empty = new Xxx3(); private Xxx3() { this.isEmpty = true; } public Xxx3(param...) { this.isEmpty = false; : } } // 生成をサポートする公開クラス public class XYZ { Ixxx Create(int n) { switch (n) { // こっちは平気 case 1: return new Xxx1(); // ここを実行する際に TypeLoadException case 2: return new Xxx2(); } } }
ソースコードのイメージは上記のようなかんじで、発生する例外メッセージは
クラス 'Xxx1' の メソッド Aaa は異なる virtual 状態で、メソッドの宣言を実装しようとしました。型 : 'Xxx1'。アセンブリ : 'Aaa'。
という NewSlot Virtual の設定ミスなどで発生するもの。(当然、この例外メッセージ中のクラス名は難読化されたものになっている)バージョンをあげると問題が発生しなくなるため v1.2.1357 の不具合ではないかと考えられる。