为什么string.Join(string,object [])特别?

Ant*_*ony 8 .net string

我看着以下表达式:

string.Join(",", new object[] { null, "StackOverflow" })
string.Join(",", new string[] { null, "StackOverflow" })
string.Join(",", new object[] { string.Empty, "StackOverflow" })
string.Join(",", new string[] { string.Empty, "StackOverflow" })
Run Code Online (Sandbox Code Playgroud)

我原以为他们会返回相同的值:

,StackOverflow
Run Code Online (Sandbox Code Playgroud)

但是,第一个表达式实际上返回string.Empty.这实际上是定义的行为:

如果值的第一个元素为null,则Join(String,Object [])方法不会连接值中的元素,而是返回String.Empty.有关此问题的许多解决方法.最简单的方法是将String.Empty的值赋给数组的第一个元素,如下例所示.

有谁知道这种不一致背后的原因?

dee*_*see 3

在您最喜欢的反编译器中,您可以看到该方法的代码是

public static string Join(string separator, params object[] values)
{
  if (values == null)
    throw new ArgumentNullException("values");
  if (values.Length == 0 || values[0] == null)
    return string.Empty;
  if (separator == null)
    separator = string.Empty;
  StringBuilder sb = StringBuilderCache.Acquire(16);
  string str1 = values[0].ToString();
  if (str1 != null)
    sb.Append(str1);
  for (int index = 1; index < values.Length; ++index)
  {
    sb.Append(separator);
    if (values[index] != null)
    {
      string str2 = values[index].ToString();
      if (str2 != null)
        sb.Append(str2);
    }
  }
  return StringBuilderCache.GetStringAndRelease(sb);
}
Run Code Online (Sandbox Code Playgroud)

负责特殊行为的部分是

  if (values.Length == 0 || values[0] == null)
    return string.Empty;
Run Code Online (Sandbox Code Playgroud)

但我们可以看到下面几行

  string str1 = values[0].ToString();
  if (str1 != null)
    sb.Append(str1);
Run Code Online (Sandbox Code Playgroud)

对我来说,返回values[0] == null却要处理似乎很奇怪values[0].ToString() == null。结合 MSDN 上的措辞(“问题”、“解决方法”),这个重载相对较新(.NET 4.0),并且其他Joins 有不同的实现接受null作为第一个元素,看起来像对我来说是一个错误,并不是真正的例外。

当然,这只是我的理解,并不是最终的答案……