Является ли это утверждение излишним или нет?

Когда я смотрел String.Join, я видел цикл for следующим образом:

public static string Join(string separator, params object[] values)
{
  ...
  for (int index = 1; index < values.Length; ++index)
  {
    sb.Append(separator);
    if (values[index] != null) // first if statement
    {
      string str2 = values[index].ToString(); 
      if (str2 != null)  // second if statement
        sb.Append(str2);
    }
  }
  ...
 }

Здесь второй оператор if кажется лишним для меня. Я думал, что если values[index] != null true, то как может быть values[index].ToString() == null true? Насколько мне известно, ToString всегда нужно что-то возвращать, верно? Даже если тип не переопределяет метод ToString, он должен возвращать полное имя типа Type (Namespace + имя класса). Поэтому, когда я вижу его в исходном коде .NET Framework, я подумал, что, может быть, есть причина, и я пропускаю что-то. Если есть причина, что это такое?

Ответ 1

Технически это не избыточно, поскольку возможно, что реализация объектов ToString возвращает null. Конечно, это не очень полезно, и пользовательские типы не должны этого делать.

Практически в вашем случае, однако, проверка избыточна, потому что StringBuilder отлично, если аргумент Append равен null. Он просто ничего не добавит:

StringBuilder sb = new StringBuilder("A");
sb.Append((string) null);
sb.Append("B");

Console.WriteLine(sb.ToString() == "AB"); // true

Ответ 2

Я предполагаю, что вы можете переопределить ToString и вернуть null.

public override string ToString()
{
    return null;
}