我看着以下表达式:
string.Join(",",new object[] { null,"StackOverflow" }) string.Join(",new string[] { null,new object[] { string.Empty,new string[] { string.Empty,"StackOverflow" })
我原以为他们会返回相同的值:
,StackOverflow
但是,第一个表达式实际上返回string.Empty.这is actually defined behavior:
If the first element of values is null,the Join(String,Object[]) method does not concatenate the elements in values but instead returns String.Empty. A number of workarounds for this issue are available. The easiest is to assign a value of String.Empty to the first element of the array,as the following example shows.
有谁知道这种不一致背后的原因?
解决方法
在您最喜欢的反编译器中,您可以看到该方法的代码是
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); }
负责特殊行为的部分是
if (values.Length == 0 || values[0] == null) return string.Empty;
但我们可以在下面看到几行
string str1 = values[0].ToString(); if (str1 != null) sb.Append(str1);
返回值[0] == null但是处理值[0] .ToString()== null似乎很奇怪.结合MSDN上的措辞(“问题”,“解决方法”),这个重载相对较新的事实(.NET 4.0)以及其他Joins有一个不同的实现接受null作为第一个元素的事实,它看起来就像我的一个错误,而不是一个真正意图的例外.
当然,这只是我的解释,而不是一个明确的答案……