【问题标题】:How to check if a boxed value is a default value [closed]如何检查装箱值是否为默认值[关闭]
【发布时间】:2020-04-30 23:11:40
【问题描述】:

我有一段具有 object 类型的 currentValue 的代码。

object currentValue = 0;

bool result = object.Equals(currentValue, default);

我希望结果为真,因为 0 是默认值。

这也不对

object.Equals(0, default);

这不是真的

Int32.Equals(0, default);

我的问题是如何检查一个装箱的值是否是默认值。

我想应该这样做:

Type type = currentValue?.GetType();
object.Equals
(
    currentValue, 
    type != null && type.IsValueType 
    ? 
    Activator.CreateInstance(type) 
    : 
    null
);

【问题讨论】:

  • 参考什么是否正确?问“是否正确”意味着您编写的代码就是答案;问题是什么?
  • 你可能想要返回trueobject.Equals(currentValue, default(int));
  • 编辑后,您的问题值得关闭。请在下次提问时更加明智。

标签: c#


【解决方案1】:

default 不总是 null 吗?

没有。它不是。例如,default for int0(在这种情况下会发生装箱)。但对于object,它是nullSome examples, and explanations.

【讨论】:

  • 我觉得这是对OP问题最直接的回答。
【解决方案2】:

您的object.Equals(currentValue, default); 返回 false; int 为 0,object 的默认值为 null,因此您的代码询问 object.Equals(0, null);,这是错误的。 C# 不会去“好吧,arg1 中的对象是一个 int,所以 arg2 中的 default 应该是 int 的默认值,即 0”。它只会去“arg2 是一个对象, object 的默认值为 null,arg2 为 null"。如果您希望 arg2 为 int,并且默认值为 0,则在默认值后的括号中传递类型。当它被传递给 Equals 时,它将被装箱为一个对象,就像第一个参数一样,但是指定 default(int) 将阻止编译器推断“你的意思是对象的默认值,因为 arg2 是对象”

object.Equals(currentValue, default(int)); //or Int32

这是否“正确”目前无法回答 - 询问我们就像询问“这段代码是否符合我的要求?” - 你没有告诉我们你想要什么,所以我们不能说,但感觉就像你在试图找到一种方法来测试一个对象是否是一个类型的默认值。在这种情况下比较默认值将int 设置为object 的默认值是不正确的。当你说default 时,你需要注意编译器会解释你的意思——如果你不明确,它会从周围的上下文中使用它对使用什么类型的最佳猜测

以下可能是实现相同目的的更紧凑/可读的方式(假设目标是确定 currentValue 的值是否是 int 的默认值):

if((int)currentValue == default)

在这种情况下,编译器将从(int)currentValue 的类型推断出它将使用的默认类型,但是您需要知道 currentValue 是一个 int 以便您可以进行转换。您不能将 currentValue 保留为对象并与 default(int) 进行比较,因为对象和 int 没有 == 的运算符重载。因此,您可能需要对原文进行这种改写,但 currentValue 不能为空:

 if(currentValue.Equals(default(int)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多