It does work without it, but really the culture should always be specified, as called out by code analysis (which incidentally gets fooled if the `ToString()` is left out).

This piqued my interest though so I thought I'd have a quick look at what happens under the covers when you do `string + int`. This is getting quite academic now but it's interesting. I had assumed this was done by operator overloading but on inspection of the IL I see:

```IL
IL_0000: ldarg.0
IL_0001: callvirt instance !0 class [mscorlib]System.Tuple`2<string, int32>::get_Item1()
IL_0006: ldarg.0
IL_0007: callvirt instance !1 class [mscorlib]System.Tuple`2<string, int32>::get_Item2()
IL_000c: box [mscorlib]System.Int32
IL_0011: call string [mscorlib]System.String::Concat(object, object)
```

So it looks like the compiler plays some tricks here and lifts the entire construct into something completely different, i.e. a call to `string.Concat(object, object)` which, of course, requires a boxing of the `Int32`. This is quite an inefficient way to do this. I guess we wouldn't really care here since it's only a test, but in any case I still think explicit statement of the culture is best practice.