Nullable ToString()

Iam*_*per 139 c# nullable

我看到到处都是如下结构:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;
Run Code Online (Sandbox Code Playgroud)

为什么不简单地使用:

string test = myVar.ToString();
Run Code Online (Sandbox Code Playgroud)

那不完全一样吗?至少Reflector说:

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}
Run Code Online (Sandbox Code Playgroud)

那么,这是正确的(较短的版本)还是我错过了什么?

Tom*_*ana 111

你是对的.同样在这个问题中,建议使用前一种解决方案,而实际上没有人注意到ToString()已经给出了正确的答案.

也许更冗长的解决方案的论点是可读性:当你调用应该是的ToString()东西时,你通常会期望 a ,尽管在这里它并没有抛出.nullNullReferenceException

  • 实际上,至少有两个人注意到:Eric Lippert和JohannesRössel. (20认同)
  • 虽然我确定这不是你的意思,但这里的引用实际上并不为空.Nullable <T>是一种值类型.这就是调用`ToString()`而不抛出任何`NullReferenceException`的原因. (7认同)
  • 如果这是心态,你会期望`.HasValue`仍然抛出异常. (2认同)

And*_*zub 14

我认为很多人都有这样的检查,因为它不是一个可以保持null值的对象的自然行为.


Pau*_*aul 5

不,你是对的,较短的版本与其他人在这方面的做法相同.我倾向于使用的另一个构造代替具有nullables的三元组是空合并运算符.它还可以保护您免受空值的影响.对于ToString(),它没有必要(正如你所指出的那样)但是对于默认的int值(例如),它可以很好地工作,例如:

int page = currentPage ?? 1;
Run Code Online (Sandbox Code Playgroud)

这允许你在页面上执行所有整数操作w/o首先显式空检查并调用currentPage中的值(其中currentPage是一个int?可能作为参数传递)


out*_*hil 5

我知道,很久以后它是相关的,但是......我怀疑这是因为像int这样的可空类型?.ToString()方法不允许您使用格式字符串.请参阅如何使用ToString()格式化可为空的DateTime?.也许在原始代码中,.ToString()中有一个格式字符串,或者编码器忘了没有格式字符串的.ToString()仍然可以在可空类型上使用.