输入int吗?vs类型int

Dr.*_*ail 45 c# casting

我的比较结果false符合预期

bool eq = typeof(int?).Equals(typeof(int));
Run Code Online (Sandbox Code Playgroud)

现在我有这个代码

List<object> items = new List<object>() { (int?)123 };
int result = items.OfType<int>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

但这会返回123-无论如何该值是类型int?

怎么会这样?

Mar*_*ell 59

可空类型具有特殊的“装箱”规则;object根据您的代码,“装箱”是将值类型视为时。不同于常规值的类型,可为空值型是盒装要么作为null(规则null,无型),或作为非可空型(TT?)。因此:将an int?装箱为int,而不是int?。然后,当你使用OfType<int>()它,你会得到所有的值int,它是:单值,你传递,因为它类型int

  • @ Dr.Snail“基本”是相对的/主观的,我敢打赌,很大一部分开发人员永远不需要知道这种细微差别。但是,如果您要处理拳击,这将是一个有用的上下文……从技术上讲,它并不是真正的C#知识,而是.NET知识(它将适用于所有语言) (14认同)
  • @Sinatr您不能-列表从不包含`int?`-它仅包含`int` *因为*可空类型的装箱规则 (5认同)

Joh*_*nny 9

以下规则将可空值类型装箱

  • 如果HasValue返回false,则产生空引用。
  • 如果HasValue返回true,则将基础值类型的T值装箱,而不是可为null的实例。

在您的示例中,遵循第二条规则,因为您具有价值:

var i = (object)(int?)123;
Run Code Online (Sandbox Code Playgroud)