How can I make my string property nullable?

C#asp.net MvcEntity FrameworkEntity Framework-Migrations

C# Problem Overview


I want to make the Middle Name (CMName) of person optional. I have been using C#.net code first approach. For integer data type its easy just by using ? operator to make in nullable. I am looking for a way to make my sting variable nullable. I tried to search but could not find the way to make it nullable.

Below is my code. Please suggest me how to make it nullable.

public class ChildrenInfo
{
    [Key]
    public int ChidrenID { get; set; }

    [Required]
    [Display(Name ="First Name")]
    [StringLength(50,ErrorMessage ="First Name cannot exceed more than 50 characters")]
    [RegularExpression(@"^[A-Z]+[a-z]*$",ErrorMessage ="Name cannot have special character,numbers or space")]
    [Column("FName")]
    public string CFName { get; set; }

    [Display(Name ="Middle Name")]
    [RegularExpression(@"^[A-Z]+[a-z]*$",ErrorMessage ="Middle Name cannot have special character,numbers or space")]
    [StringLength(35,ErrorMessage ="Middle Name cannot have more than 35 characters")]
    [Column("MName")]
    public string CMName { get; set; }
}   

C# Solutions


Solution 1 - C#

String is a reference type and always nullable, you don't need to do anything special. Specifying that a type is nullable is necessary only for value types.

Solution 2 - C#

C# 8.0 is published now so you can make reference types nullable too. For this you have to add

#nullable enable

Feature over your namespace. It is detailed here

For example something like this will work:

#nullable enable
namespace TestCSharpEight
{
  public class Developer
  {
    public string FullName { get; set; }
    public string UserName { get; set; }

    public Developer(string fullName)
    {
        FullName = fullName;
        UserName = null;
    }
}}

Also you can have a look this nice article from John Skeet that explains details.

Solution 3 - C#

System.String is a reference type so you don't need to do anything like

Nullable<string>

It already has a null value (the null reference):

string x = null; // No problems here

Solution 4 - C#

Strings are nullable in C# anyway because they are reference types. You can just use public string CMName { get; set; } and you'll be able to set it to null.

Solution 5 - C#

It's been a while when the question has been asked and C# changed not much but became a bit better. Take a look Nullable reference types (C# reference)

string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness

C# as a language a "bit" outdated from modern languages and became misleading.

for instance in typescript, swift there's a "?" to clearly say it's a nullable type, be careful. It's pretty clear and it's awesome. C# doesn't/didn't have this ability, as a result, a simple contract IPerson very misleading. As per C# FirstName and LastName could be null but is it true? is per business logic FirstName/LastName really could be null? the answer is we don't know because C# doesn't have the ability to say it directly.

interface IPerson
{
  public string FirstName;
  public string LastName;
}

Solution 6 - C#

It's not possible to make reference types Nullable. Only value types can be used in a Nullable structure. Appending a question mark to a value type name makes it nullable. These two lines are the same:

int? a = null;
Nullable<int> a = null;

Solution 7 - C#

As far as I can see this is just a warning. You can still set strings to null and the code will still compile and run.

To disable these warnings for your whole project you can set the Nullable flag to disabled in your .csproj file as shown below:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <Nullable>disable</Nullable>
  </PropertyGroup>

Solution 8 - C#

string type is a reference type, therefore it is nullable by default. You can only use Nullable<T> with value types.

public struct Nullable<T> where T : struct

Which means that whatever type is replaced for the generic parameter, it must be a value type.

Solution 9 - C#

As others have pointed out, string is always nullable in C#. I suspect you are asking the question because you are not able to leave the middle name as null or blank? I suspect the problem is with your validation attributes, most likely the RegEx. I'm not able to fully parse RegEx in my head but I think your RegEx insists on the first character being present. I could be wrong - RegEx is hard. In any case, try commenting out your validation attributes and see if it works, then add them back in one at a time.

Solution 10 - C#

You don't need to do anything, the Model Binding will pass null to property without any problem.

Solution 11 - C#

string is by default Nullable ,you don't need to do anything to make string Nullable

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSabin Kumar SharmaView Question on Stackoverflow
Solution 1 - C#aw04View Answer on Stackoverflow
Solution 2 - C#nzrytmnView Answer on Stackoverflow
Solution 3 - C#Kashif MustafaView Answer on Stackoverflow
Solution 4 - C#TimView Answer on Stackoverflow
Solution 5 - C#GSerjoView Answer on Stackoverflow
Solution 6 - C#VovaView Answer on Stackoverflow
Solution 7 - C#SquiblyView Answer on Stackoverflow
Solution 8 - C#KapolView Answer on Stackoverflow
Solution 9 - C#flytzenView Answer on Stackoverflow
Solution 10 - C#Renato LeiteView Answer on Stackoverflow
Solution 11 - C#BillView Answer on Stackoverflow