Update: I have filed a bug report with Microsoft Connect, please vote for it!
Update 2: Microsoft have marked the bug report as fixed
Other than a few nops, reflector indictes the only differences are in the IsGuid method:
DEBUG:
.method public hidebysig static bool IsGuid(object item) cil managed
{
.maxstack 2
.locals init (
[0] bool CS$1$0000)
L_0000: nop
L_0001: ldarg.0
L_0002: isinst [mscorlib]System.Guid
L_0007: ldnull
L_0008: cgt.un
L_000a: stloc.0
L_000b: br.s L_000d
L_000d: ldloc.0
L_000e: ret
}
RELEASE:
.method public hidebysig static bool IsGuid(object item) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: isinst [mscorlib]System.Guid
L_0006: ldnull
L_0007: cgt.un
L_0009: ret
}
I'm not fluent enough to explain these differences but this is a community wiki answer so maybe somebody else can enlighten us?
Changing the method to make it generic works around this (possible bug?)
public static bool IsGuid(T item)
{
return item is Guid;
}
As does forcing it into a local varible (but it must be used in the method to prevent the optimizations kicking in):
public static bool IsGuid(object item)
{
bool a = item is Guid;
a.ToString();
return a;
}