什么是 C# 中的可为空类型
本文关键字:类型 什么 | 更新日期: 2023-09-27 18:29:54
int? _fileControlNo = null;
public int? FileControlNo
{
get { return _fileControlNo; }
set { _fileControlNo = value; }
}
当我为上述属性分配空值时,我收到语法错误。
objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? null : Convert.ToInt32(sArrElements.Value(3));
请,如果我能够使用 Nullable Type 在 valuetype 对象中设置 null 值,谁能向我解释为什么会发生错误。
条件运算符的结果需要是可以隐式相互转换的相同类型。
在您的情况下,您有null
和Int32
- 这些都违反了该要求。
如果返回的不是Int32
,而是返回可为空的Int32
,则可以将null
隐式转换为此类型,并且您的代码将起作用(或者,将null
转换为int?
(。
将你的null
投射到int?
objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? (int?) null : Convert.ToInt32(sArrElements.Value(3));
条件运算符需要返回相同类型的结果,在您的情况下,不可能返回null
这应该有效
sArrElements.Value(3)==null ? (int?)null : Convert.ToInt32(sArrElements.Value(3));
可为空的类型正是他们所说的:也可以存储空值的简单值类型。
我建议你根本不需要最后一行代码。 您应该能够侥幸逃脱:
objDPRUtils.FileControlNo =sArrElements.Value(3);
如果您确实想在 null 的情况下分配另一个值,请使用 null 合并运算符 ??
objDPRUtils.FileControlNo =sArrElements.Value(3)??0;
在这种情况下,如果右侧为 null,则将值 0 分配给FileControlNo
。
尝试像这样直接分配:
objDPRUtils.FileControlNo =sArrElements.Value(3);
您的代码混合了 null 类型,并且 Int32 不能像这样混合在这种情况下。它们需要属于同一类型。
如果您使用int.TryParse
并且只尝试在成功时设置值,您将获得相同的结果,并且可以在字段上使用HasValue
来确定其是否为 null,这是通常使用可为空类型的方式
愚蠢的例子
class Program
{
private static int? _fileControlNo;
static void Main(string[] args)
{
string[] sArrElements = new string[] { "1", "2", "3", null };
int result;
if (int.TryParse(sArrElements[3], out result))
{
FileControlNo = result;
}
if (_fileControlNo.HasValue)
{
// do something here
}
}
public static int? FileControlNo
{
get { return _fileControlNo; }
set { _fileControlNo = value; }
}
}
您会注意到,在这种情况下,HasValue
测试中的代码将永远不会执行,因为无法设置_fileControlNo因为 tryParse 总是失败(更改索引器,这将更改(。