先来看一段代码:

int类型为空 mysql int可以为null吗_赋值

null值用来表示数据类型未被赋予任何值,它是一种引用类型且它只能赋值给引用类型,由于string是一个特殊的引用类型,因此编译器不会报错。

但是当它赋值给值类型int类型的时候,编译器就会报错:

int类型为空 mysql int可以为null吗_显式转换_02

我们知道数据库中是有NULL值的,例如下面的一张表,年龄(int类型)是可以为空的,代表目前不知道此人年龄,那么当我们在C#代码向数据库插入数据时,就会需要一个可空的int类型。

int类型为空 mysql int可以为null吗_System_03

但是int、bool等这些类型不能表示数据库中的“Null” 。因此C#提供了“可空类型”这种语法,只要在类型后加?就构成了可空的数据类型,比如int?、bool?,这样
int? i=null 就可以了。解决数据库中int可以为null,而C#中int不能为null的问题。

1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace 可空数据类型
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             //string s1 = null;
13             int? i = null;
14             Console.WriteLine(i);
15         }
16     }
17 }

由于i为空,所以不会有任何数据显示。

int类型为空 mysql int可以为null吗_System_04

T?其实是System.Nullable<T>的简写,可空类型在ADO.NET编程中大量使用,用来解决数据库与C#代码数据类型不一致的问题。

来看一下msdn文档中关于System.Nullable的说明:

int类型为空 mysql int可以为null吗_赋值_05

int类型为空 mysql int可以为null吗_int类型为空 mysql_06

int类型为空 mysql int可以为null吗_System_07

System.Nullable的定义:

int类型为空 mysql int可以为null吗_显式转换_08

由它的定义可知:判断可空类型是否为空,用i==null或者i.HasValue;得到可空变量的值,int i1=(int)i.Value或者int i1=i.Value。
类型转换:不可空类型赋值给可空类型无需显式转换(一定成功),可空类型赋值给不可空类型则需显式转换(不一定成功)

如果int? i3 = null;

1 static void Main(string[] args)
 2         {
 3             int? i = null;
 4             int? i3 = null;
 5             //int? i3 = 8;//不可空类型赋值给可空类型无需显式转换(一定成功)
 6             if (i3 == null)
 7             {
 8                 Console.WriteLine("i3为空");
 9             }
10             else
11             {
12                 i3++;
13                 int i4 = (int)i3;//可空类型赋值给不可空类型则需显式转换(不一定成功)例如i3为空,则不成功!
14 
15                 Console.WriteLine("i3不为空,{0}", i3);
16             }
17             if (i3.HasValue)
18             {
19                 int i4 = i3.Value;
20                 Console.WriteLine("i3不为空,{0}", i3);
21             }
22             else
23             {
24                 Console.WriteLine("i3不为空!");
25             }
26         }

int类型为空 mysql int可以为null吗_赋值_09

 

如果int? i3 = 8;

 

1 static void Main(string[] args)
 2         {
 3             int? i = null;
 4             //int? i3 = null;
 5             int? i3 = 8;//不可空类型赋值给可空类型无需显式转换(一定成功)
 6             if (i3 == null)
 7             {
 8                 Console.WriteLine("i3为空");
 9             }
10             else
11             {
12                 i3++;
13                 int i4 = (int)i3;//可空类型赋值给不可空类型则需显式转换(不一定成功)例如i3为空,则不成功!
14 
15                 Console.WriteLine("i3不为空,{0}", i3);
16             }
17             if (i3.HasValue)
18             {
19                 int i4 = i3.Value;
20                 Console.WriteLine("i3不为空,{0}", i3);
21             }
22             else
23             {
24                 Console.WriteLine("i3为空!");
25             }
26         }

int类型为空 mysql int可以为null吗_System_10