C# 可为null的ToString()

C# 可为null的ToString(),c#,nullable,C#,Nullable,我到处都能看到这样的建筑: int? myVar = null; string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty; 为什么不简单地使用: string test = myVar.ToString(); 这不是完全一样吗? 至少他说: public override string ToString() { if (!this.HasValue) { return ""; } ret

我到处都能看到这样的建筑:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;
为什么不简单地使用:

string test = myVar.ToString();
这不是完全一样吗? 至少他说:

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}

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

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

也许只是遵循一种模式?或者他们不知道后端。你是对的,代码完全相同。你甚至可以:

int? i = null;
i.ToString(); //No NullReferenceException

不,你是对的,较短的版本与其他人在这方面所做的相同。我倾向于大量使用的另一个构造,而不是带null的三元结构,是null合并操作符,。它还可以保护您不受空值的影响。对于ToString(),它不是必需的(正如您所指出的),但是对于默认的int值(例如),它工作得很好,例如:

int page = currentPage ?? 1;

这使您可以在页面上执行所有整数操作,首先显式地检查并调用currentPage中的值(其中currentPage是int?可能作为参数传递)

您是完全正确的。同样在中,建议使用前一种解决方案,但实际上没有人注意到
ToString()
已经给出了正确的答案


也许更详细的解决方案的论据是可读性:当您对本应为
null
的某个对象调用
ToString()
时,您通常期望出现
NullReferenceException
,尽管这里没有抛出它。

我知道,在它相关很久之后,但是。。。我怀疑这是因为像int这样的可为空类型?.ToString()方法不允许使用格式字符串。看见可能在原始代码中,.ToString()中有一个格式字符串,或者可能是程序员忘记了,没有格式字符串的.ToString()在可空类型上仍然可用。

int?
是简化可空变量声明的语法糖。 它与
Nullable
相同

因此,如果您查看
Nullable
(参见下文)的
ToString()方法的实现,您会注意到,如果没有值,它将返回空字符串

public struct Nullable<T> where T : struct
{
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }
}

@安德鲁同意,因为人们(像我一样)一开始认为它会抛出一个例外。我不知道这是一种行为。我肯定会认为,如果调用x.ToString(),任何为(x==null)返回true的构造也会抛出NullReferenceException。事实上,至少有两个人注意到了:Eric Lippert和Johannes Rössel。虽然我肯定这不是你的意思,但这里的引用实际上不是null。Nullable是一种值类型。这就是为什么调用
ToString()
时不会抛出任何
NullReferenceException
异常的原因。如果这是一种心态,你会期望
.HasValue
仍然抛出该异常。人们使用详细版本的另一个原因可能是为了与
myNullableDateTime.HasValue这样的表达式对等?myNullableDateTime.Value.ToString(“d”):null
其中确实需要展开的对象来访问所需的
ToString
方法。当然,还有一个更简洁的解决方案:
$“{myNullableDateTime:d}”
如果ToString()需要具有不变的区域性,您可能需要走很长的路,因为nullables在其菜单中没有它。我没有见过这样的代码:)
static void Main(string[] args)
{
    int? a = null;
    Console.WriteLine(a.ToString()); // Prints empty string to console.
}