2011-10-07 12 views
9

Ho un progetto di 3,5 .net in VS2008 e sto cercando di utilizzare this overload di string.Join() (quello che prende un string e IEnumerable<T>) e il compilatore non sembra sapere questo sovraccarico.string.join() in .net 3.5

Questo è il codice che ho provato

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

dove Foo() è

IEnumerable<string> Foo() 
    { 

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

ottengo

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

Naturalmente, se uso Foo().ToArray() funziona, ma io sono chiedendo perché il sovraccarico che prende IEnumerable<T> non funzionerà.

MSDN nella visualizzazione classica dice che è compatibile con VS2008/.net 3,5

enter image description here

(non riuscivo a trovare il messaggio "Questa pagina è specifico per ...." in vista non-classici così ho pensato che avrei messo su uno schermo-cap)

+2

Er, [ 'String.Join (String, IEnumerable )'] (http://msdn.microsoft.com/en-us/library/dd783876%28v=VS.100%29.aspx) non è stato aggiunto fino alla v4 (e successivamente alla 4.5) - ** EDIT ** Per essere chiari, ecco i [Metodi di stringa in 3.5] (http://msdn.microsoft.com/en-us/library/0h8wc12c % 28v = VS.90% 29.aspx) –

+0

La visualizzazione leggera non ha "Questa pagina è specifica per ....". Invece si seleziona la versione che si desidera vedere utilizzando una combo nella parte superiore della pagina. – mydogisbox

+0

'Click to Rate e Give Feedback' –

risposta

7

le informazioni sulla versione in fondo dice qualcosa di diverso:.

Version information on MSDN

Nota che puoi trovare le informazioni sulla versione in fondo all'articolo, indipendentemente dalla vista selezionata (potrebbe sembrare un po 'diversa).

La nota in alto a destra si è trovato si riferisce alla versione selezionata risorsa che si può trovare nella URL, come ad esempio in:

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

(evidenziato in grassetto). Di solito questo seleziona anche la versione del framework (dato che sono rilasciati in tandem con VS), ma apparentemente sembra che ci sia un errore nella classificazione qui.

Lo segnalerei solo come un errore.

+0

Grazie. Come posso segnalare questo errore "Visualizzazione classica"? –

+0

C'è un »Clicca per votare e dare un feedback« nell'angolo in alto a destra della pagina. Lo userei per avvisare il team di manutenzione di questo problema. Nella versione leggera c'è un link »Feedback« in fondo alla pagina. – Joey

3

Se si dà un'occhiata alla sezione piattaforme supportate si può scoprire che:

NET Framework Supportato in: 4

Quindi, come usare un caso ToArray() lungo con Foo() chiamata:

Foo().ToArray() 
12

Il string.Join sovraccarico accettando IEnumerable<T> non è stato aggiunto fino a .NET 4. Non è disponibile in .Net 3.5. La visualizzazione classica nella documentazione MSDN è semplicemente errata.

In .NET 3.5, sarà necessario richiamare ToArray() su IEnumerable<string> per passarlo nel metodo Join.

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

Per riferimento, these are the overloads sostenuto da NET 3.5.

0

La visualizzazione classica fornisce effettivamente uno link, ma deve essere una voce errata nel proprio CMS o altro. Se fai clic sul link sopra riportato, vedi che ha perso il suo contesto (il menu a sinistra non sa dove sei, che dovrebbe essere in System.String.Join), e il menu a discesa della versione non lo riconosce neanche.

normal version funziona e mostra solo per .NET 4 e .NET 4.5.

.NET Framework Supportato in: 4

.NET Framework Client Profile Supportato in: 4

0

Per quello che vale, se si vuole attaccare con .Net 2.0 o 3.5, e evitare di dover scrivere ".ToArray()" sul secondo argomento di String.Join(), ecco una semplice implementazione che dovrebbe imitare String.Join() implementato in .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(); 
     } 
    }