protected override void GenerateInner(CodeGenerator generator) { switch (Value) { case null: generator.Write(TokenType.NullLiteral, "null"); break; case char v: generator.OutputCharLiteral(v); break; case sbyte v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); break; case ushort v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); break; case uint v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); generator.Write(TokenType.IntLiteral, 'u'); break; case ulong v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); generator.Write(TokenType.IntLiteral, "ul"); break; case string v: generator.OutputStringLiteral(v); break; case byte v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); break; case short v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); break; case int v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); break; case long v: generator.Write(TokenType.IntLiteral, v.ToString(CultureInfo.InvariantCulture)); generator.Write(TokenType.IntLiteral, 'L'); break; case float v: { if (float.IsNaN(v)) { generator.Write(TokenType.Keyword, "float"); generator.Write(TokenType.Punctuation, '.'); generator.Write(TokenType.Identifier, "NaN"); } else if (float.IsNegativeInfinity(v)) { generator.Write(TokenType.Keyword, "float"); generator.Write(TokenType.Punctuation, '.'); generator.Write(TokenType.Identifier, "NegativeInfinity"); } else if (float.IsPositiveInfinity(v)) { generator.Write(TokenType.Keyword, "float"); generator.Write(TokenType.Punctuation, '.'); generator.Write(TokenType.Identifier, "PositiveInfinity"); } else { generator.Write(TokenType.FloatLiteral, v.ToString(CultureInfo.InvariantCulture)); generator.Write(TokenType.FloatLiteral, 'f'); } break; } case double v: { if (double.IsNaN(v)) { generator.Write(TokenType.Keyword, "double"); generator.Write(TokenType.Punctuation, '.'); generator.Write(TokenType.Identifier, "NaN"); } else if (double.IsNegativeInfinity(v)) { generator.Write(TokenType.Keyword, "double"); generator.Write(TokenType.Punctuation, '.'); generator.Write(TokenType.Identifier, "NegativeInfinity"); } else if (double.IsPositiveInfinity(v)) { generator.Write(TokenType.Keyword, "double"); generator.Write(TokenType.Punctuation, '.'); generator.Write(TokenType.Identifier, "PositiveInfinity"); } else { var str = v.ToString("R", CultureInfo.InvariantCulture); generator.Write(TokenType.FloatLiteral, str.All(char.IsDigit) ? (str + ".0") : str); } break; } case decimal v: generator.Write(TokenType.FloatLiteral, v.ToString(CultureInfo.InvariantCulture)); generator.Write(TokenType.FloatLiteral, 'm'); break; case bool v: generator.Write(TokenType.BoolLiteral, v ? "true" : "false"); break; default: throw new InvalidOperationException(string.Format("Invalid Primitive Type: {0}. Consider using CodeObjectCreateExpression instead.", Value.GetType().ToString())); } }