Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有理由强制转换为类型,然后再转换为其可为null的类型?_C#_Casting_Type Conversion - Fatal编程技术网

C# 是否有理由强制转换为类型,然后再转换为其可为null的类型?

C# 是否有理由强制转换为类型,然后再转换为其可为null的类型?,c#,casting,type-conversion,C#,Casting,Type Conversion,我刚才看到了这行代码: Item = (int?)(int)row["Item"]; 有什么原因不能仅仅是: Item = (int?)row["Item"]; 如果行[“项”]为空,此行将引发异常。这个坏主意,不要做。见;对象可以直接强制转换为可为null的int(但如果对象实际上不是int,则会导致InvalidCastException)。这两个强制转换所做的一件事是,对int?的直接强制转换不会执行null的隐式检查 当强制转换为int,然后转换为可为null的int时,如果对象变量

我刚才看到了这行代码:

Item = (int?)(int)row["Item"];
有什么原因不能仅仅是:

Item = (int?)row["Item"];
如果
行[“项”]
为空,此行将引发异常。这个坏主意,不要做。

见;对象可以直接强制转换为可为null的int(但如果对象实际上不是int,则会导致InvalidCastException)。这两个强制转换所做的一件事是,对
int?
的直接强制转换不会执行null的隐式检查

当强制转换为int,然后转换为可为null的int时,如果对象变量的值为null,则将抛出ICE。当直接强制转换为可为null的int时,null处理得很好,但是如果代码试图检索Value属性而不检查是否确实存在,则会抛出invalidoOperationException


这看起来像是一个半途而废的“快速失败”尝试,我不推荐它作为“好代码”。只需直接强制转换为nullable,然后测试HasValue属性并从那里开始。

您可以使用
作为关键字

Item = row["Item"] as int?; 

我认为编写这行代码的正确方法是:

int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;

实际上,您可以将
null
强制转换为可为null的类型

Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];

不太确定这可能会导致什么异常,但我使用它时没有问题。

试试看(当
行[“项”]
null
,包含
int
或其他内容时)。@tonie-考虑
行[“项”]
包含
对象
尝试将其直接强制转换为可为空的整数是个坏主意。如果
行[“项”]
中包含的对象不是整数,则这可能会导致InvalidCastException。此外,我不会使用这两种方法,因为这两种方法都不能解决像这样强制转换的大量继承问题。@Ramhound:as
操作符在对象不是整数的情况下返回
null
。因此,这里有一个大问题,
(int?)行[“Item”]
行[“Item”]作为int有什么好处?
Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];