-
Notifications
You must be signed in to change notification settings - Fork 831
Description
Issue description
Hi!
I couldn't find a definitive source or existing issue for my problem so I'm creating this issue...
Problem:
type MyRecord = {
NonNullableString: string
NullableString: string | null
}With this record, I was hoping to see that NullableString would have type string? from C#, but it doesn't (it has type string).
Taking a look at ILSpy, I see that some nullness metadata are added, but on the backing field of the property only, which is not public: (internal string? NullableString@;)

The public properties and the constructor do not appear to have nullness metadata.
Consequence:
Interop between F# and C# is inconsistent regarding nullness:

I was hoping to use this feature to declare DTOs from my F# project and expose them in a web API implemented in a C# ASP.NET Core project.
Swagger/OpenAPI with Swashbuckle already support reading nullness metadata on properties to show this info in the generated specs, but because of this issue it doesn't work.
Question:
Is that behavior on purpose?
Did I miss something in the specs somewhere?
Is there any plan to change the current behavior?
Thanks.
Choose one or more from the following categories of impact
- Unexpected nullness warning (false positive in nullness checking, code uses --checknulls and langversion:preview).
- Missing nullness warning in a case which can produce nulls (false negative, code uses --checknulls and langversion:preview).
- Breaking change related to older
nullconstructs in code not using the checknulls switch. - Breaking change related to generic code and explicit type constraints (
null,not null). - Type inference issue (i.e. code worked without type annotations before, and applying the --checknulls enforces type annotations).
- C#/F# interop issue related to nullness metadata.
- Other (none of the categories above apply).
Operating System
Windows (Default)
What .NET runtime/SDK kind are you seeing the issue on
.NET SDK (.NET Core, .NET 5+)
.NET Runtime/SDK version
.NET 9
Reproducible code snippet and actual behavior
type MyRecord = {
NonNullableString: string
NullableString: string | null
}Possible workarounds
No response
Metadata
Metadata
Assignees
Labels
Type
Projects
Status