我在vs2008中有一个.net 3.5项目,我正在尝试string.Join()
使用string
(IEnumerable<T>
和 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>
它可行,但我想知道为什么过载{{1}}不起作用。
(我在非经典视图中找不到“此页面特定于......”的消息,所以我想我会设置一个屏幕上限。)
答案 0 :(得分:15)
直到.NET 4才添加string.Join
重载接受IEnumerable<T>
。它在.Net 3.5中不可用。 MSDN文档中的经典视图完全不正确。
在.NET 3.5中,您需要在ToArray()
上调用IEnumerable<string>
,以便将其传递到Join
方法。
string.Join(" ", Foo().ToArray());
供参考,.NET 3.5支持these are the overloads。
答案 1 :(得分:7)
底部的版本信息说明了不同的内容:
请注意,您可以在文章底部找到该版本信息,无论选择的视图如何(它可能看起来有点不同)。
您找到的右上角的注释是指您可以在网址中找到的所选资源版本,例如:
http://msdn.microsoft.com/en-us/library/dd783876
的(VS.90)
强>.aspx
(以粗体突出显示)。通常这会选择框架版本(因为这些版本与VS一起发布),但显然这里的分类似乎存在错误。
我只是把它报告为错误。
答案 2 :(得分:3)
如果您查看“支持的平台”部分,您可以找到:
.NET Framework 支持:4
因此,在案例中使用ToArray()和Foo()调用:
Foo().ToArray()
答案 3 :(得分:1)
您正在查看的MDSN页面仅适用于.Net 4及更高版本。这是您应该检查的页面:
http://msdn.microsoft.com/en-us/library/0h8wc12c(v=VS.90).aspx
请注意,它专门列出了.Net Framework 3.5,并且它不包含您的重载。
答案 4 :(得分:0)
经典视图确实提供了link,但它必须是CMS中的错误条目或其他任何内容。如果单击上述链接,您会看到它丢失了它的上下文(左侧的菜单不知道您在哪里,应该在System.String.Join中),并且版本下拉列表也无法识别它。 / p>
normal version有效,并且仅显示.NET 4和.NET 4.5。
.NET Framework受以下版本支持:4
.NET Framework Client Profile受以下版本支持:4
答案 5 :(得分: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();
}
}