diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index e68767da9..0bf882cc5 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -318,6 +318,17 @@ internal static bool ToManagedValue(IntPtr value, Type obType, return true; } + if (obType.IsGenericType && obType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + if( value == Runtime.PyNone ) + { + result = null; + return true; + } + // Set type to underlying type + obType = obType.GetGenericArguments()[0]; + } + if (obType.IsArray) { return ToArray(value, obType, out result, setError); diff --git a/src/testing/conversiontest.cs b/src/testing/conversiontest.cs index 7179c7607..36294594c 100644 --- a/src/testing/conversiontest.cs +++ b/src/testing/conversiontest.cs @@ -32,8 +32,14 @@ public ConversionTest() public byte[] ByteArrayField; public sbyte[] SByteArrayField; + + public T? Echo(T? arg) where T: struct { + return arg; + } + } + public interface ISpam { diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index ac263ef5d..9152e30d0 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -641,6 +641,8 @@ def test_enum_conversion(): def test_null_conversion(): """Test null conversion.""" + import System + ob = ConversionTest() ob.StringField = None @@ -652,6 +654,10 @@ def test_null_conversion(): ob.SpamField = None assert ob.SpamField is None + pi = 22/7 + assert ob.Echo[System.Double](pi) == pi + assert ob.Echo[System.DateTime](None) is None + # Primitive types and enums should not be set to null. with pytest.raises(TypeError):