From c648c8116eabb31882c49c44810b4f078a86d9ad Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sun, 5 Oct 2025 21:45:13 +0200 Subject: [PATCH] Add implicit cast from .NET IPNetwork to NpgsqlInet Helps EFCore.PG especially, continues #5821. --- .../Converters/Networking/IPNetworkConverter.cs | 13 +++++++++++-- src/Npgsql/NpgsqlTypes/NpgsqlTypes.cs | 7 +++++++ src/Npgsql/PublicAPI.Unshipped.txt | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Npgsql/Internal/Converters/Networking/IPNetworkConverter.cs b/src/Npgsql/Internal/Converters/Networking/IPNetworkConverter.cs index 77714edf29..6fc7b5401e 100644 --- a/src/Npgsql/Internal/Converters/Networking/IPNetworkConverter.cs +++ b/src/Npgsql/Internal/Converters/Networking/IPNetworkConverter.cs @@ -1,4 +1,5 @@ -using System.Net; +using System; +using System.Net; // ReSharper disable once CheckNamespace namespace Npgsql.Internal.Converters; @@ -18,5 +19,13 @@ protected override IPNetwork ReadCore(PgReader reader) } protected override void WriteCore(PgWriter writer, IPNetwork value) - => NpgsqlInetConverter.WriteImpl(writer, (value.BaseAddress, (byte)value.PrefixLength), isCidr: true); + => NpgsqlInetConverter.WriteImpl( + writer, + ( + value.BaseAddress, + value.PrefixLength <= byte.MaxValue + ? (byte)value.PrefixLength + : throw new ArgumentOutOfRangeException(nameof(value), "IPNetwork.PrefixLength is too large to fit in a byte") + ), + isCidr: true); } diff --git a/src/Npgsql/NpgsqlTypes/NpgsqlTypes.cs b/src/Npgsql/NpgsqlTypes/NpgsqlTypes.cs index 7d5eedf7af..4736ca00ec 100644 --- a/src/Npgsql/NpgsqlTypes/NpgsqlTypes.cs +++ b/src/Npgsql/NpgsqlTypes/NpgsqlTypes.cs @@ -469,6 +469,13 @@ public static explicit operator IPAddress(NpgsqlInet inet) public static implicit operator NpgsqlInet(IPAddress ip) => new(ip); + public static implicit operator NpgsqlInet(IPNetwork cidr) + => new( + cidr.BaseAddress, + cidr.PrefixLength <= byte.MaxValue + ? (byte)cidr.PrefixLength + : throw new ArgumentOutOfRangeException(nameof(cidr), "IPNetwork.PrefixLength is too large to fit in a byte")); + public void Deconstruct(out IPAddress address, out byte netmask) { address = Address; diff --git a/src/Npgsql/PublicAPI.Unshipped.txt b/src/Npgsql/PublicAPI.Unshipped.txt index a1d261ead0..a0a2c14d56 100644 --- a/src/Npgsql/PublicAPI.Unshipped.txt +++ b/src/Npgsql/PublicAPI.Unshipped.txt @@ -84,4 +84,5 @@ Npgsql.NpgsqlConnection.ReloadTypesAsync(System.Threading.CancellationToken canc *REMOVED*Npgsql.NpgsqlSlimDataSourceBuilder.MapComposite(string? pgName = null, Npgsql.INpgsqlNameTranslator? nameTranslator = null) -> Npgsql.TypeMapping.INpgsqlTypeMapper! *REMOVED*Npgsql.NpgsqlSlimDataSourceBuilder.MapEnum(System.Type! clrType, string? pgName = null, Npgsql.INpgsqlNameTranslator? nameTranslator = null) -> Npgsql.TypeMapping.INpgsqlTypeMapper! *REMOVED*Npgsql.NpgsqlSlimDataSourceBuilder.MapEnum(string? pgName = null, Npgsql.INpgsqlNameTranslator? nameTranslator = null) -> Npgsql.TypeMapping.INpgsqlTypeMapper! +static NpgsqlTypes.NpgsqlInet.implicit operator NpgsqlTypes.NpgsqlInet(System.Net.IPNetwork cidr) -> NpgsqlTypes.NpgsqlInet static readonly NpgsqlTypes.NpgsqlTsVector.Empty -> NpgsqlTypes.NpgsqlTsVector!