.net 为什么string.Join(string,object[])是特殊的?

.net 为什么string.Join(string,object[])是特殊的?,.net,string,.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"

我在看下面的表达:

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" })
我原以为它们会返回相同的值:

,StackOverflow
但是,第一个表达式实际上返回
string.Empty
。这:

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


有人知道这种不一致的原因吗?

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

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);
}
但我们可以看到下面几行

  string str1 = values[0].ToString();
  if (str1 != null)
    sb.Append(str1);
对我来说,返回
值[0]==null
而处理
值[0].ToString()==null
似乎很奇怪。结合MSDN上的措辞(“问题”、“解决方法”),这个重载是相对较新的(.NET 4.0),以及另一个
Join
s有一个不同的实现,它接受
null
作为第一个元素,这在我看来像是一个bug,实际上并不是一个预期的异常


当然,这只是我的解释,而不是一个明确的答案……

用那种措辞(“解决方法”、“问题”),我会认为这是一个bug,而不是一个预期的行为…@Vache No,这是故意编码的。在reflector中打开它查看..@SriramSakthivel是的,我可以看到,但下面几行代码似乎与此行为相矛盾。有一个
if
处理第一个元素的字符串表示形式的空值。@Vache Yes我可以看到。还要注意,这个愚蠢的限制只适用于
Join
方法的重载。其他实现不确定
值[0]。ToString()==null
表示任何内容。如果
values[0]
null
,它将抛出
NullReferenceException
。它是检查以确保某人没有从
ToString
返回
null
。对我来说,检查
值[0]很重要。ToString()==null
,因为
值[0]
可能不是null,但它可以通过重写
ToString()
@Anthony返回null,这是我的观点。我们处理具有
null
字符串表示的对象,那么为什么不处理
null
?我觉得这不一致。
  string str1 = values[0].ToString();
  if (str1 != null)
    sb.Append(str1);