C# Compiler Generating Invalid IL When Dealing With Generics
I just had to find out the reason for a strange bug in Rhino Mocks. The issue turned out to be the C# Compiler producing invalid IL, which cause the following error:
Let us start from the beginning, here is an interface and a class:
public interface MyInterface
{
}
public class MyGenericClass<I>
{
}
Now, let us define the following test:
public abstract class TestGenericPartialMockBase<I, C> where I : MyInterface where C : MyGenericClass<I>
{
public void CauseProblem()
{
bool val = false;
if (val)
{
Factory factory = new Factory();
object bad = factory.Create<C>();
}
}
}
[TestFixture]
public class TestGenericPartialMock1 : TestGenericPartialMockBase<MyInterface, MyGenericClass<MyInterface>>
{
[Test]
public void TestGenericPartialMockTest1()
{
CauseProblem();
}
}
Notice that the code in the if() clause will never execute, its mere precense cause this error.
The Factory class is simply:
public class Factory
{
public T Create<T>(params object[] args)
where T: class
{
return null;
}
}
Put everything in one file and try to run the test, and it will give the error above.
Removing the "where T: class" clause from the Create<T>() method will fix this issue, as well as practically any modification to the code. This is the second time in about three weeks that I see the C# compiler silently issuing invalid IL for complex generic scenario. Interestingly, both scenarios involved inheritance from a generic class.
Update: You can vote on this bug here
Comments
Comment preview