Don't use ,(...) to force ... to be an Array. The automatic unwrapping behaviour when outputting objects (display, file, printer, etc...) can be misleading.
$myCollection = ,(get-process)
does not leave $myCollection with an Array of processes unless there is only one process (such as from get-process -name). Instead, $myCollection will be an Array of a single element containing the whole output (either a single object or an Array of the output objects). This fact is obscured by the format output cmdlets (Format-Table, Format-List and Format-Wide) which examine the objects received and, if any are Arrays, unwrap them. (More detail How PowerShell Formatting and Outputting REALLY works).
You say "But if I do this it works fine":
$myCollection | foreach { $_.starttime }
and I say, yes, you get a list of starttimes BUT not the way you think. In the above, $myCollection is unwrapped and each element is sent into the pipeline to foreach. There is only one element which is an Array so the foreach loops once with $_ set to an Array of processes. Since Array is a collection but has no starttime member, PowerShell (V3+) performs a member enumeration creating an Array consisting of the values of the starttime members of each element of $_. This Array is then unwrapped and sent into the pipeline.
You say "So what, the effect is the same" and I reply, yes until you try something more complicated:
$myFiles = ,(gci -file *)
$myFiles | foreach { $_.name+' '+$_.length }
Expected output is a list of file names and lengths. Actual output is a list of names, a blank line and the number of files. Why? $myFiles is an Array of one element containing the list of files so foreach loops once with $_ being this list. An Array has no name member so PowerShell performs a member enumeration producing an Array of names. Next, a String of one space is added (concatenated) to this Array. Finally, $_.length is added. Since an Array does have a length member, this value (an Int32) is added to the Array of names and ' '. This Array is then unwrapped and sent out.
Summary, if you want something that might or might not be an Array to definitely be an Array, don't use ,(...). Always use @(...), that's what it's for.
However, in other situations, the use of ,(...) is appropriate but can still create confusion.
When parsing the command line, spaces separate tokens not arguments. Therefore, the following are equivalent:
1,2,3
1 , 2, 3
This can trip you up when using the prepended , to create an array of one item. Say you have a cmdlet that takes an Array as a parameter but you want to supply only one element that itself is an Array. For example,
new-object collections.arraylist ,(1,2,3)
New-Object : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'ComObject'. Specified method is not supported.
At line:1 char:12
+ new-object collections.arraylist ,(1,2,3)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [New-Object], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.NewObjectCommand
Since the space before the , was essentially ignored by the parser (, is a single character token so doesn't need separation), this was parsed as:
new-object ("collections.arraylist",(1,2,3))
so in this case it should be:
new-object collections.arraylist (,(1,2,3))
Note: @(1,2,3) would not work since 1,2,3 is already an Array.
,$Collectionto wrap the collection in an array before you send it out ... that will unwrap as a collection.