string.Join()in .net 3.5

我在vs2008中有一个.net 3.5项目,我正在尝试使用string.Join() (带stringIEnumerable那个string.Join() 重载 ,编译器似乎不知道这个重载。

这是我试过的代码

  var result = string.Join(" ", Foo()); 

Foo()的地方

  IEnumerable Foo() { foreach(string s in new []{"1", "2", "3"} ) { yield return s; } } 

我明白了

 > Error 2 Argument '2': cannot convert from > 'System.Collections.Generic.IEnumerable' to 'string[]' 

当然,如果我使用Foo().ToArray()它可以工作,但我想知道为什么IEnumerable的重载将不起作用。

经典视图中的MSDN表示它与vs2008 / .net 3.5兼容

在此处输入图像描述

(我在非经典视图中找不到“此页面特定于……”的消息,所以我想我会设置一个屏幕截图。)

底部的版本信息说明了不同之处:

MSDN上的版本信息

请注意,您可以在文章底部找到该版本信息,无论选择的视图如何(它可能看起来有点不同)。

您找到的右上角的注释是指您可以在URL中找到的所选资源版本,例如:

http://msdn.microsoft.com/en-us/library/dd783876

(以粗体突出显示)。 通常这也会选择框架版本(因为这些版本与VS一起发布),但显然这里的分类似乎存在错误。

我只是把它报告为错误。

接受IEnumerablestring.Join重载直到.NET 4才被添加。它在.Net 3.5中不可用。 MSDN文档中的经典视图完全不正确。

在.NET 3.5中,您需要在IEnumerable上调用ToArray()以将其传递给Join方法。

 string.Join(" ", Foo().ToArray()); 

作为参考, 这些是 .NET 3.5支持的重载 。

如果您查看支持的平台部分,您可以找到:

.NET Framework受以下版本支持:4

因此,作为一个案例使用ToArray()和Foo()调用:

 Foo().ToArray() 

您正在查看的MDSN页面仅适用于.Net 4及更高版本。 这是您应该检查的页面:

http://msdn.microsoft.com/en-us/library/0h8wc12c(v=VS.90).aspx

请注意,它专门列出.Net Framework 3.5,并且它不包含您的重载。

经典视图确实提供了它的链接 ,但它必须是他们的CMS或其他任何错误的条目。 如果单击上述链接,您会看到它丢失了它的上下文(左侧的菜单不知道您在哪里,应该在System.String.Join中),并且版本下拉列表也无法识别它。

普通版本有效,并且仅显示.NET 4和.NET 4.5。

.NET Framework受以下版本支持:4

.NET Framework Client Profile受以下版本支持:4

对于它的价值,如果你想坚持.Net 2.0或3.5,并避免在String.Join()的第二个参数上写“.ToArray()”,这里是一个简单的实现,应该模仿字符串.Join()在.Net 4.0中实现。

  public static class MString { ///  /// This method simply duplicates the String.Join() method that was introduced in .Net 4.0. So /// it can be used in C# projects targeting .Net 3.5 or earlier. ///  /// type of the object collection (typically string) /// separator to be placed between the strings /// collection of objects that can be converted to strings /// string containing all of the objects converted to string with separator string in between public static string Join(string separatorString, IEnumerable valueObjects) { if (separatorString == null) separatorString = ""; bool firstValue = true; StringBuilder stringBuilder = new StringBuilder(); foreach (T oneObject in valueObjects) { if (!firstValue) stringBuilder.Append(separatorString); firstValue = false; stringBuilder.Append(oneObject == null ? "" : oneObject.ToString()); } return stringBuilder.ToString(); } }