@@ -2668,35 +2668,38 @@ private static bool TryEmitCoalesceOperator(BinaryExpression expr, IReadOnlyList
26682668
26692669 private static void EmitDefault(Type type, ILGenerator il)
26702670 {
2671- if (! type.GetTypeInfo().IsValueType )
2671+ if (type.IsClass )
26722672 {
26732673 il.Demit(OpCodes.Ldnull);
2674+ return;
26742675 }
2675- else if (
2676- type == typeof(bool) ||
2677- type == typeof(byte) ||
2678- type == typeof(char) ||
2679- type == typeof(sbyte) ||
2680- type == typeof(int) ||
2681- type == typeof(uint) ||
2682- type == typeof(short) ||
2683- type == typeof(ushort))
2684- {
2685- il.Demit(OpCodes.Ldc_I4_0);
2686- }
2687- else if (
2688- type == typeof(long) ||
2689- type == typeof(ulong))
2676+ switch (Type.GetTypeCode(type))
26902677 {
2691- il.Demit(OpCodes.Ldc_I4_0);
2692- il.Demit(OpCodes.Conv_I8);
2678+ case TypeCode.Boolean:
2679+ case TypeCode.Char:
2680+ case TypeCode.Byte:
2681+ case TypeCode.SByte:
2682+ case TypeCode.Int16:
2683+ case TypeCode.UInt16:
2684+ case TypeCode.Int32:
2685+ case TypeCode.UInt32:
2686+ il.Demit(OpCodes.Ldc_I4_0);
2687+ break;
2688+ case TypeCode.Int64:
2689+ case TypeCode.UInt64:
2690+ il.Demit(OpCodes.Ldc_I4_0);
2691+ il.Demit(OpCodes.Conv_I8);
2692+ break;
2693+ case TypeCode.Single:
2694+ il.Demit(OpCodes.Ldc_R4, default(float));
2695+ break;
2696+ case TypeCode.Double:
2697+ il.Demit(OpCodes.Ldc_R8, default(double));
2698+ break;
2699+ default:
2700+ EmitLoadLocalVariable(il, InitValueTypeVariable(il, type));
2701+ break;
26932702 }
2694- else if (type == typeof(float))
2695- il.Demit(OpCodes.Ldc_R4, default(float));
2696- else if (type == typeof(double))
2697- il.Demit(OpCodes.Ldc_R8, default(double));
2698- else
2699- EmitLoadLocalVariable(il, InitValueTypeVariable(il, type));
27002703 }
27012704
27022705#if LIGHT_EXPRESSION
0 commit comments