I am trying to write DBNull.Value using Parameters.AddWithVallue when an optional parameter (a string) of a C# method is null.
public static void Abc(string distrito, string municipio = null)
command.Parameters.AddWithValue("@Municipio", municipio ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Municipio", municipio.Length > 0 ? municipio : (object)DBNull.Value);
However, (object)DBNULL returns two different values in two different working ways. One writes empty/null and other NULL.

I'm going to make a few assumptions, but I think I know what's going on.
municipiois probably an empty string. It is not null.In that case,
municipio ?? (object)DBNull.Valuewill be an empty string, not null. However,municipio.Length > 0 ? municipio : (object)DBNull.Valuehas a value ofDBNull.Value, which will generate a null in SQL Server. In this case, ifmunicipiois null, then this code will throw. Since you say the code runs, I'm assuming thatmunicipiois not null.