2011-10-07 10 views
9

Tengo un proyecto .NET 3.5 en VS2008 y estoy tratando de utilizar this overload de string.Join() (la que lleva un string y IEnumerable<T>) y no parece que el compilador saber acerca esta sobrecargastring.join() en .NET 3.5

Este es el código que he intentado

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

donde Foo() es

IEnumerable<string> Foo() 
    { 

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

me sale

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

Por supuesto, si uso Foo().ToArray() funciona, pero estoy preguntándose por qué la sobrecarga que toma IEnumerable<T> no funcionará.

MSDN en vista clásica dice que es compatible con VS2008/.net 3.5

enter image description here

(no pude encontrar el mensaje "Esta página es específica de ...." en las vistas no clásicos así que pensé que había puesto una pantalla-cap)

+2

Er, [ 'string.join (String, IEnumerable )'] (http://msdn.microsoft.com/en-us/library/dd783876%28v=VS.100%29.aspx) no se agregó hasta v4 (y posteriormente en 4.5) - ** EDITAR ** Para ser claros, aquí están los [Métodos de cadena en 3.5] (http://msdn.microsoft.com/en-us/library/0h8wc12c % 28v = VS.90% 29.aspx) –

+0

La vista liviana no tiene "Esta página es específica para ...". En su lugar, selecciona la versión que desea ver usando un combo en la parte superior de la página. – mydogisbox

+0

'Haga clic para calificar y dar su opinión' –

Respuesta

7

la información de la versión en la parte inferior dice algo diferente:.

Version information on MSDN

Tenga en cuenta que puede encontrar la información de la versión en la parte inferior del artículo, independientemente de la vista seleccionada (podría ser un poco diferente).

La nota en la parte superior derecha que ha encontrado se refiere a la versión seleccionada de recursos que puede encontrar en la URL, como por ejemplo en:

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

(resaltado en negrita). Por lo general, esto también selecciona la versión de framework (ya que se lanzan en tándem con VS), pero aparentemente parece haber un error en la clasificación aquí.

Solo lo reportaría como un error.

+0

Gracias. ¿Cómo puedo reportar este error de "Vista clásica"? –

+0

Hay un »Haga clic para evaluar y dar su opinión« en la esquina superior derecha de la página. Lo usaría para alertar al equipo de mantenimiento sobre este problema. En la versión ligera hay un enlace de "Comentarios" en la parte inferior de la página. – Joey

3

Si se echa un vistazo a la sección Plataformas compatibles se puede descubrir que:

NET Framework Compatible con: 4

Así como un caso de uso ToArray() junto con Foo() llamada:

Foo().ToArray() 
12

La sobrecarga string.Join aceptar IEnumerable<T> no se agregó hasta .NET 4. No está disponible en .Net 3.5. La vista clásica en la documentación de MSDN es simplemente incorrecta.

En .NET 3.5, necesitará invocar ToArray() en el IEnumerable<string> para pasarlo al método Join.

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

Para referencia, these are the overloads soportados por .NET 3.5.

0

La vista clásica sí proporciona un link, pero debe ser una entrada incorrecta en su CMS o lo que sea. Si hace clic en el enlace mencionado anteriormente, verá que ha perdido su contexto (el menú de la izquierda no sabe dónde se encuentra, que debe estar en System.String.Join), y el menú desplegable de la versión tampoco lo reconoce.

El normal version funciona, y muestra que es solo para .NET 4 y .NET 4.5.

.NET Framework Compatible con: 4

.NET Framework Client Profile Compatible con: 4

0

Por lo que vale la pena, si quieres seguir con .Net 2.0 o 3.5, y evitar tener que escribir ".ToArray()" en el segundo argumento de String.Join(), aquí hay una implementación simple que debe imitar a String.Join() implementado en .Net 4.0.

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(); 
     } 
    }