68972


型判定の為に、開いた(オープン)ジェネリック型から閉じた(クローズド)ジェネリック型の`Type`を作成しようとすると、一部の型を引数にした時に`TypeLoadException`が発生する。

ドキュメントには`TypeLoadException`例外が発生することは記載されていない。  
<https://docs.microsoft.com/en-
us/dotnet/api/system.type.makegenerictype?view=netcore-3.1>

### 再現コード

[code]

    var typeParam = typeof(ArgIterator); // 実際はtypeParamは様々な型に対して行う。
    _ = typeof(IEquatable<>).MakeGenericType(typeParam);
    
[/code]

### 例外メッセージ

[code]

    System.TypeLoadException: 'The generic type 'System.IEquatable`1' was used with an invalid instantiation in assembly 'System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'.'
    
[/code]

### 環境

.NET Core 3.1 および .NET Framework 4.8


CC BY-SA 4.0
2020-07-26T03:31:10.863
68971
2020-07-26T03:39:16.447
9113
question
c# .net
Type.MakeGenericType()でTypeLoadExceptionがスローされる場合がある


仕様と思われる。  
下記のコードはC#ではコンパイルエラー(CS0306)になる。

[code]

    class C : IEquatable<ArgIterator>
    {
        public bool Equals(ArgIterator other) => throw new NotImplementedException();
    }
    
[/code]

ref-like型構造体は、ジェネリック型引数にできないという制約がある。

.NET
Coreでは、`MakeGenericType`の引数に渡す前に`Type.IsByRefLike`プロパティを調べ、`true`の場合は`MakeGenericType`を呼び出さないようにすることで回避可能である。

.NET Frameworkでは`Type.IsByRefLike`が無いため、個々の型を弾くか、`try-catch`でスキップする必要があると思われる。


CC BY-SA 4.0
2020-07-26T03:31:10.863
68972
2020-07-26T03:39:16.447
2020-07-26T03:39:16.447
9113
9113
68971
answer