diff --git a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs index 359c72c8..f430b06b 100644 --- a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs +++ b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs @@ -34,6 +34,7 @@ using System; using System.Collections.Generic; using System.Reflection; +#if !DOTNET35 namespace Google.Protobuf.Compatibility { public class TypeExtensionsTest @@ -50,24 +51,6 @@ namespace Google.Protobuf.Compatibility { } - [Test] - [TestCase(typeof(int), true)] - [TestCase(typeof(int?), true)] - [TestCase(typeof(Nullable<>), true)] - [TestCase(typeof(WireFormat.WireType), true)] - [TestCase(typeof(string), false)] - [TestCase(typeof(object), false)] - [TestCase(typeof(Enum), false)] - [TestCase(typeof(ValueType), false)] - [TestCase(typeof(TypeExtensionsTest), false)] - [TestCase(typeof(Action), false)] - [TestCase(typeof(Action<>), false)] - [TestCase(typeof(IDisposable), false)] - public void IsValueType(Type type, bool expected) - { - Assert.AreEqual(expected, TypeExtensions.IsValueType(type)); - } -#if !DOTNET35 [Test] [TestCase(typeof(object), typeof(string), true)] [TestCase(typeof(object), typeof(int), true)] @@ -129,6 +112,6 @@ namespace Google.Protobuf.Compatibility { Assert.Throws(() => TypeExtensions.GetMethod(type, name)); } -#endif } } +#endif diff --git a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs index fe9cda8d..2d93183b 100644 --- a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs +++ b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs @@ -33,6 +33,7 @@ using System; using System.Reflection; +#if !DOTNET35 namespace Google.Protobuf.Compatibility { /// @@ -45,20 +46,6 @@ namespace Google.Protobuf.Compatibility /// internal static class TypeExtensions { - /// - /// Returns true if the target type is a value type, including a nullable value type or an enum, or false - /// if it's a reference type (class, delegate, interface - including System.ValueType and System.Enum). - /// -#if DOTNET35 - internal static bool IsValueType(this Type target) { - return target.IsValueType; - } -#else - internal static bool IsValueType(this Type target) - { - return target.GetTypeInfo().IsValueType; - } - /// /// See https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom /// @@ -114,6 +101,6 @@ namespace Google.Protobuf.Compatibility } return null; } -#endif } } +#endif diff --git a/csharp/src/Google.Protobuf/FieldCodec.cs b/csharp/src/Google.Protobuf/FieldCodec.cs index 98313088..c28b47e1 100644 --- a/csharp/src/Google.Protobuf/FieldCodec.cs +++ b/csharp/src/Google.Protobuf/FieldCodec.cs @@ -347,7 +347,8 @@ namespace Google.Protobuf public sealed class FieldCodec { private static readonly T DefaultDefault; - private static readonly bool TypeSupportsPacking = typeof(T).IsValueType() && Nullable.GetUnderlyingType(typeof(T)) == null; + // Only non-nullable value types support packing. This is the simplest way of detecting that. + private static readonly bool TypeSupportsPacking = default(T) != null; static FieldCodec() {