KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
My question is somewhat related to this one: Explicitly implemented interface and generic constraint . My question, however, is how the compiler enables a generic constraint to eliminate the need for boxing a value type that explicitly implements an interface. I guess my question boils down to two parts: What is going on with the behind-the-scenes CLR implementation that requires a value type to be boxed when accessing an explicitly implemented interface member, and What happens with a generic constraint that removes this requirement? Some example code: internal struct TestStruct : IEquatable<TestStruct> { bool IEquatable<TestStruct>.Equals(TestStruct other) { return true; } } internal class TesterClass { // Methods public static bool AreEqual<T>(T arg1, T arg2) where T: IEquatable<T> { return arg1.Equals(arg2); } public static void Run() { TestStruct t1 = new TestStruct(); TestStruct t2 = new TestStruct(); Debug.Assert(((IEquatable<TestStruct>) t1).Equals(t2)); Debug.Assert(AreEqual<TestStruct>(t1, t2)); } } And the resultant IL: .class private sequential ansi sealed beforefieldinit TestStruct extends [mscorlib]System.ValueType implements [mscorlib]System.IEquatable`1<valuetype TestStruct> { .method private hidebysig newslot virtual final instance bool System.IEquatable<TestStruct>.Equals(valuetype TestStruct other) cil managed { .override [mscorlib]System.IEquatable`1<valuetype TestStruct>::Equals .maxstack 1 .locals init ( [0] bool CS$1$0000) L_0000: nop L_0001: ldc.i4.1 L_0002: stloc.0 L_0003: br.
Tags (comma-separated)
Save Edits
Cancel