【问题标题】:Is new() required for nullable non-reference type variable?可为空的非引用类型变量是否需要 new()?
【发布时间】:2017-11-19 02:27:19
【问题描述】:

如果我创建了一个非引用类型的变量,比如int,可以为空,即int?,这是否意味着我需要在赋值之前使用构造函数?

通常我只是初始化一个非引用类型变量

int foo = 5;

但是如果我有一个可以为空的非引用数据类型变量是否需要初始化,如下所示,还是我仍然可以使用上面的简单初始化?

int? foo = new int();
foo = 5;

【问题讨论】:

  • 是的,您仍然可以使用简单的初始化。 :)
  • 您可以尝试int? foo = 5 看看效果如何,比输入这个问题要快得多。
  • @Evk 我可以,但我不明白发生了什么以及它是否会在不同的情况下发生变化 - 我宁愿询问和理解,而不是仅仅假设:)
  • 对于其他人,我发现这个问题的答案解释了 why @PatrickHoffman 的答案是这样的。 stackoverflow.com/a/3149180/1292918
  • @Toby 如果您想知道它的为什么有效,您可以简单地查看该类型的文档,或者,如果做一些简单的研究没有导致回答(如果你真的费心去做任何事情,它会)你可以问为什么这个任务有效,而不是问如果它有效,这又是什么您可以在几秒钟内轻松搞定。浪费其他人的时间,因为您根本懒得花几秒钟尝试某事或进行简单的网络搜索,这是非常不体贴的。

标签: c# types constructor nullable


【解决方案1】:

int?Nullable<int> 的语法糖;至于Nullable<T>,如果我们看看它的实现

https://referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e

我们会找到一个隐式运算符声明:

public struct Nullable<T> where T : struct
{
     ...

     [System.Runtime.Versioning.NonVersionable]
     public static implicit operator Nullable<T>(T value) {
         return new Nullable<T>(value);
     }

     ...
}

所以对于任何 struct T 而不是 explicit 构造函数调用

T value = ...

T? test = new Nullable<T>(value);

我们可以使用隐式操作符

T? test = value; // implicit operation in action

在您的特定情况下,Tint,我们有

int? foo = 5;

【讨论】:

  • 你说的听起来很合理,但实际上并非如此。编写int? foo = 5; 时,编译器不使用隐式转换运算符。相反,它直接调用Nullable&lt;int&gt; 构造函数。
  • @svick:隐式运算符仅包含构造函数调用; C# 编译器(优化器?)只是消除了中间调用。
  • 我相信 C# 编译器从不执行那种内联优化,所以不应该这样。
【解决方案2】:

没有。您无需在分配之前创建实例。 int? 是一个在赋值时创建的结构。

你的任务foo = 5;实际上是:

foo = new Nullable<int>(5);

这一切都是由编译器完成的。不需要自己做。

【讨论】:

  • @adjan,这个问题可能很糟糕(在主观方面),但它根本不是基于意见的,一些代码要么有效,要么无效。此外,由于您对问题的看法而对答案投反对票是不正确的
  • @adjan,这个问题完全没问题,所以答案。我看到您已删除的答案本身就很差,因此可能被否决了
  • @Toby 我编辑了你的答案,所以我可以删除反对票。
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2011-01-26
  • 2019-12-17
  • 2012-02-11
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多