Just curious…
So I get that if I convert the string version of the date to a DateTime object and pass it into the String.Format() method, then I”ll get the desired results.
String.Format("The date is {0:MMMM dd, yyyy}", DateTime.Parse("05-22-2012"));
“The date is May 22, 2012”
But why doesn’t this work?
String.Format("The date is {0:MMMM dd, yyyy}", "05-22-2012")
“The date is 05-22-2012”
Sorry if this is a stupid question, but I’m just trying to understand how this works.
Thanks
The other answers here hit on salient points, but let’s put them all together an examine how
String.Formatworks.It has five overloads, but we’re going to talk only about the one that they all redirect to (this is not the actual code, if you want to see it with Reflector or ILSpy, you will find it in
StringBuilder.AppendFormat). This is simplified for easy understanding.In your question you ask why the format string doesn’t get applied when you pass “05-22-2012”. As Guffa said, that is not a DateTime object, it is a String object.
As GSerjo said, a String is not IFormattable. Strings are not formattable because formatting is the process of converting something into a String. A string is already a string!
So you can see that when the Format method gets to indexer,
argwill not be IFormattable and it will simply callToString. Calling ToString on a string simply returns itself, it’s already a string.In summary, if your format string contains an index with an inner-format string (e.g. {0:format}), that inner-format string will only be applied if the associated argument is
IFormattableand it knows what to do with the format string you give it.