Як вказати короткий літерал int без кастингу?


77

Чи є спосіб вказати, що моя змінна є коротким int? Я шукаю щось подібне до суфікса M для десяткових знаків. Щодо десяткових знаків, я не повинен це говорити

var d = (decimal)1.23;

Я можу просто написати так:

var d = 1.23M;

Чи є спосіб написати це

   var s  = SomeLiteralWithoutCast

так що s мається на увазі як короткий int?


У випадку, про який ви згадаєте, він просто затьмарить тип без причини.
harold

1
Відповідь тут: stackoverflow.com/questions/5820721 / ...
nycdan

Якщо це константа, то чому ви оголошуєте її змінною ? Змінні варіюються, тому їх називають "змінними"; константи ні.
Eric Lippert

@EricLippert Я думаю, він плутає "константу" з "буквальним".
phoog

@EricLippert: насправді я мав на увазі SomeLiteralWithoutCast. Я виправив своє запитання.
Arne Lund

Відповіді:


131

Коротка відповідь, ні . У C # немає жодної букви, Sяку можна було б використовувати, оскільки var a = 123Sвона вказувала б aна тип short. Є Lза long, Fза float, Dза double, Mза decimal, але ніS . Було б непогано, якби було, але немає.

var a = 1M;  // decimal
var a = 1L;  // long
var a = 1F;  // float
var a = 1D;  // double
var a = 1;   // int

var a = 1U;  // uint
var a = 1UL; // ulong

але ні

var a = 1S; // not possible, you must use (short)1;

25

Питання трохи заплутане. Давайте визначимо деякі терміни:

Вираз константи є (грубо кажучи) вираз , як відомо, компілятор буде конкретне значення константи.

Буквальний представляє особливий вид постійного вираження; 123і Math.PIобидва є постійними виразами. Перше - це буквально, друге - ні.

Поле константи є членом такого типу , який ініціалізується за виразом постійна, а потім може бути використано в якості постійного вираження в іншому місці. Math.PIє прикладом постійного поля.

Локальна константа , як поле постійна, але область дії до блоку. (Подібно до того, як локальна змінна масштабується до блоку.)

Постійні поля та локальні константи повинні чітко вказувати свій тип; немає форми "var" для констант. (Сама ідея здригається; "const var" - це, очевидно, оксиморон.)

Локальні змінні не повинні вказувати свій тип; тип можна вивести з ініціалізатора. Така локальна змінна називається "неявно набраною локальною змінною".

Отже, ваше запитання: "чи є спосіб написати буквальний константний вираз типу short, який можна використовувати для ініціалізації неявно введеної локальної змінної типу short?"

Ні, немає. Ви можете явно ввести локальну змінну:

short s1 = 123;

Ви можете явно ввести локальну константу:

const short s2 = 123;

Або ви можете зробити константний вираз, який містить привід для скорочення:

var s3 = (short)123;

Або ви можете зробити локальну або польову константу і використовувати її ім'я для ініціалізатора неявно введеного локального:

var s4 = s2;

Але це ніяк не можна обійти; shortповинен десь з'являтися , або в полі, або в місцевій декларації, або в складі.


6
Чому немає суфікса для короткого літералу?
gdoron підтримує Моніку

1
@gdoron: Усі функції за замовчуванням не виконуються, поки хтось їх не реалізує. Немає суфікса для короткого літералу, оскільки ніхто ніколи не розробляв, не впроваджував, не тестував і не передавав цю функцію. Точніше: чому це повинно бути ? Яка переконлива перевага наявності суфікса для короткого літералу в C # 1.0 ? Відсутність ознаки не потрібно обґрунтовувати; якщо ви вважаєте, що функція є хорошою ідеєю, тоді людина, яка хоче її, має обґрунтувати її. Яке виправдання?
Ерік Ліпперт,

5
@gdoron: Існують інші обґрунтування, крім var. Наприклад, у вас є два методи M (int) і M (короткий), і ви хочете змусити викликати коротке перевантаження: M((short)123)але без приведення. Вигода від усунення акторського складу в цьому сценарії невелика порівняно з вартістю. (І в цьому випадку акторський склад, мабуть, кращий, оскільки це робить кришталево чітким, яке перевантаження називається.)
Ерік Ліпперт

16
@EricLippert Я часто дивувався, чому команда C # реалізувала суфікси для деяких числових примітивних типів, але не для інших.
Джеймс

4
Наявність коротких літералів також зробить код на зразок short x = y < 0 ? (short)0 : (short)ycleaner ( short x = y < 0 ? 0S : (short)y)
Клемен,

10

Суфікс для shortтипу даних у C # відсутній . Якщо ви хочете, щоб цілочисельний літерал був коротким, вам потрібно чітко вказати тип і надати літерал, який знаходиться в діапазоні.

short s = 123;

1
Він просить const короткий, а не змінний.
gdoron підтримує Моніку

4
@gdoron, я не згоден. Я вважаю, що значення більше стосувалось буквальних констант, таких як 1, 2 або 3, а не константа з точки зору мовної конструкції const short foo = SOMEVALUE;. Погляньте на це в контексті десяткових декларацій, і я вірю, що ви прийдете до того ж висновку.
Ентоні Пеграм

Ерік Ліпперт зрозумів, як і я ... див. Його коментар. =)
gdoron підтримує Моніку

2
Він не непогрішний (тільки в основному так), і , можливо, словоблуддя може заплутати, але я думаю , що більшість відповідей (і голоси!) Запропонувати більше людей вивести сенс інших , ніж const.
Ентоні Пеграм

8

Два варіанти; ні ідеально:

  1. Видаліть var, явно вказавши тип:

    short s = 123;
    
  2. Використовуйте синтаксис приведення (зазначивши, що це операція під час компіляції, а не час виконання):

    var s = (short)123;
    

Це єдині варіанти вказівки на буквальний шорт.


1
Насправді він просить скоротити const .
gdoron підтримує Моніку

1
Чому перший варіант не ідеальний?
gdoron підтримує Моніку

1
@Gordon Я маю на увазі: в контексті операції, що не хоче цього синтаксису, але хоче суфіксального синтаксису, наприклад десяткового (M) тощо
Marc Gravell

@Gordon that (const / not) не змінює синтаксис, однак
Marc Gravell

2

Ви можете використовувати наступне:

var value = (short)123;

Звичайно, це насправді не має сенсу, оскільки вся суть var не в тому, щоб писати тип.


0

Implicitly constЦього не існує, тож вам доведеться визначити свою const такою короткою, як це:

const short x = 999;

дивіться більше тут


2
може бути ідеєю надати йому ідентифікатор. Це не компілюється.
Адам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.