<div>During full AOT, It seems that if generics is a ref type, AOT is skipped (which makes sense because most of the time it is not necessary, one codegen for any ref type is usually enough).</div><div>However, if the class internally uses a struct based on the generic types, it will fail at runtime.</div>

<div>Here is a simple example showcasing the issue:</div><div><br></div><div><div>public class B</div><div>{</div><div>    public void Test<T>()</div><div>    {</div><div>        System.Console.WriteLine(typeof(T));</div>

<div>    }</div><div>}</div><div><br></div><div>public class A<T></div><div>{</div><div>    public void Test()</div><div>    {</div><div>        new B().Test<System.Collections.Generic.KeyValuePair<T, T>>();</div>

<div>    }</div><div>}</div><div><br></div><div><br></div><div>class P</div><div>{</div><div>    static void Main(string[] args)</div><div>    {</div><div>        new A<int>().Test();</div><div>        new A<string>().Test();</div>

<div>    }</div><div>}</div></div><div><br></div><div>If I run this program with full aot, it will fail.</div><div>new A<int> will work (AOT forced because value type)</div><div>However, new A<string> will generate a JIT exception (because even though string is a ref type, A should be AOT for this specific type because KeyValuePair inside A<T> needs to be JITed.)</div>

<div><br></div><div>But maybe I misunderstood the problem (or it is just a specific bug), because this other case actually work (I was expecting it to have the same issue):</div><div><br></div><div><div>public class B</div>

<div>{</div><div>    public void Test<T>()</div><div>    {</div><div>        System.Console.WriteLine(typeof(System.Collections.Generic.KeyValuePair<T, T>));</div><div>    }</div><div>}</div><div><br></div><div>

public class A<T></div><div>{</div><div>    public void Test()</div><div>    {</div><div>        new B().Test<T>();</div><div>    }</div><div>}</div><div><br></div><div><br></div><div>class P</div><div>{</div>

<div>    static void Main(string[] args)</div><div>    {</div><div>        new A<int>().Test();</div><div>        new A<string>().Test();</div><div>    }</div><div>}</div></div><div><br></div><div>Just wanted to check if I understood the issue right and if there would be nothing preventing from fixing it?</div>

<div>I wouldn't mind taking a look at the sources by myself if necessary.</div><div><br></div><div>Virgile</div><div><br></div>