2.4.4.2 из spec состояний:
Тип целочисленного литерала определяется следующим образом:
• Если у литерала нет суффикса, он имеет первый из этих типов, в котором его значение может быть представлено: int, uint, long, ulong.
• Если к литералу добавляется суффикс U или u, он имеет первый из этих типов, в которомего значение может быть представлено: uint, ulong.
• Если к литералу добавляется L или l, он имеет первый из этих типов, в котором его значение может быть представлено: long, ulong.
• Если к литералу добавляются суффиксы UL, Ul, uL, ul, LU, Lu, lU или lu, он имеет тип ulong.
Таким образом, L
вывод («Если у литерала нет суффикса»), поэтому не требуется .Ваши два примера сделают то же самое (после компиляции).
Почему тогда вы можете использовать L?Ну, например, может быть:
public const long doesNotCompile = 3000000000 * 2;
public const long doesCompile = 3000000000L * 2;
В первой строке литерал (то есть 3000000000
) представляет собой uint
(в соответствии с 2.4.4.2), в то время как во второй строке это long
(опять же из-за 2.4.4.2 - так как это явно указано).
Это означает, что компилятор позволит doesCompile
компилировать, но не позволит doesNotCompile
компилировать, Это потому, что 3000000000 * 2
слишком велик, чтобы поместиться в uint
.
Но для базовых употреблений, таких как ваше, где это прямое задание - тогда да, оно не нужнов любом случае.И нет недостатков в том, чтобы не включать его.