Сгенерированный IL немного отличается:
L_000d: ldarg.0
L_000e: box !!T
L_0013: callvirt instance void WindowsFormsApplication1.IBar::Hidden()
против
L_000d: ldarga.s foo
L_000f: constrained !!T
L_0015: callvirt instance void WindowsFormsApplication1.IBar::Hidden()
Если бы T
был типом значения, это привело бы к тому, что foo
было бы помещено в CallHidden1
, но не в CallHidden2
. Однако, поскольку Foo
является классом, любой тип T
, полученный из Foo
, не будет типом значения, и, следовательно, поведение будет идентичным.