2011-10-07 136 views
9

我在VS2008一个.NET 3.5的项目,我想使用的string.Join()this overload(一,需要一个stringIEnumerable<T>)和编译器似乎不知道这个过载。的string.join()在.net 3.5

这是我尝试

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

其中Foo()

IEnumerable<string> Foo() 
    { 

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

我得到

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

当然,代码,如果我用Foo().ToArray()它的工作原理,但我想知道为什么需要IEnumerable<T>的超载不起作用。

MSDN经典视图中说,这是用VS2008兼容/ .NET 3.5

enter image description here

(我无法找到消息“此页是特定于......”非经典的观点所以我想我会提出了一个屏幕帽)

+2

呃['的string.join(字符串,IEnumerable的)'](http://msdn.microsoft.com/en-us/library/dd783876%28v=VS.100%29.aspx)直到第4版(以及后来的第4.5版)才添加 - 编辑**要清楚,这里是[3.5中的字符串方法](http://msdn.microsoft.com/zh-cn/library/0h8wc12c %28v = VS.90%29.aspx) –

+0

轻量级视图没有“此页面特定于...”。相反,您可以使用页面顶部的组合选择要查看的版本。 – mydogisbox

+0

'Click to Rate and Give Feedback' –

回答

7

底部的版本信息说不同的东西:

Version information on MSDN

请注意,您可以在文章底部找到版本信息,而不管选定的视图(它可能看起来有点不同)。

在右上角的说明你已经发现是指所选资源版本,你可以在网址中找到,如:

http://msdn.microsoft.com/en-us/library/dd783876(VS.90).aspx

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

我只是把它报告为一个错误。

+0

谢谢。我如何报告这个“经典视图”错误? –

+0

有一个»点击率,并给出反馈«在页面的右上角。我会用它来提醒维护团队解决这个问题。在轻量级版本中,页面底部有一个“Feedback”链接。 – Joey

3

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

NET框架 支持:

所以,作为一个案例使用ToArray的()沿用Foo()调用:

Foo().ToArray() 
12

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

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

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

仅供参考,these are the overloads受.NET 3.5支持。

0

经典视图的确提供了一个link它,但它必须是在他们的CMS或其他任何错误的条目。如果你点击前面提到的链接,你会发现它的上下文丢失了(左边的菜单不知道你在哪里,应该在System.String.Join中),而版本下拉列表也不能识别它。

normal version的作品,并表明它只适用于.NET 4和.NET 4.5。

.NET Framework提供支持:4

.NET Framework Client Profile受支持:

0

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

public static class MString 
    { 
     /// <summary> 
     /// 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. 
     /// </summary> 
     /// <typeparam name="T">type of the object collection (typically string)</typeparam> 
     /// <param name="separatorString">separator to be placed between the strings</param> 
     /// <param name="valueObjects">collection of objects that can be converted to strings</param> 
     /// <returns>string containing all of the objects converted to string with separator string in between</returns> 
     public static string Join<T>(string separatorString, IEnumerable<T> 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(); 
     } 
    }