在C#里,单独的问号 ? 和双问号 ?? 是两个容易看混但用途不同的运算符。? 主要作为可空类型修饰符,让值类型也能表示空值;?? 则是空合并运算符,用来提供默认值。下面通过代码说明它们的具体区别。

? 作为可空类型修饰符
在类型后面加 ?,可以把 int、bool 这类值类型变成可空版本,变量除了正常值还能赋值为 null。
using System;
class Demo
{
static void Main()
{
int? a = null; // 可空int,允许为null
int b = 10;
Console.WriteLine(a.HasValue); // False
Console.WriteLine(b);
}
}
?? 空合并运算符
?? 用来判断左侧是否为 null,如果是就取右侧值,否则取左侧值。常用来给可能为空的结果设定默认内容。
using System;
class Demo
{
static void Main()
{
int? score = null;
int result = score ?? 60; // score为null,所以result为60
Console.WriteLine(result);
string name = null;
string show = name ?? "匿名"; // show为匿名
Console.WriteLine(show);
}
}
两者核心区别
?用在类型后,改变变量本身的空能力,属于类型系统层面。??用在表达式间,做运行时的空判断和取值,属于逻辑运算层面。- ? 不能单独处理默认值,?? 不能让值类型变可空。
常见组合用法
实际开发中经常一起用,先声明可空类型,再用 ?? 给默认值:
using System;
class Demo
{
static void Main()
{
int? age = null;
int realAge = age ?? 18; // 为空时默认18
Console.WriteLine(realAge);
}
}
掌握 ? 与 ?? 的差异,能让你在处理不确定数据时空判断更简洁,也减少多余的 if 判断代码。
C#nullable_operatornull_coalescing修改时间:2026-07-27 12:27:14