如何在不进行转换的情况下指定短的int文字?

Arn*_*und 69 c# c#-4.0

有没有办法指定我的变量是一个短整数?我正在寻找类似于M后缀的小数字.对于小数,我不必说

var d = (decimal)1.23;
Run Code Online (Sandbox Code Playgroud)

我可以写如下:

var d = 1.23M;
Run Code Online (Sandbox Code Playgroud)

有没有办法写这个

   var s  = SomeLiteralWithoutCast
Run Code Online (Sandbox Code Playgroud)

所以s暗示是短的int?

Tom*_*ski 118

简短回答,.在C#中,没有S可以使用的字母,因为var a = 123S它表明它a是类型的short.有Lfor long,Ffor float,Dfor double,Mfor 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
Run Code Online (Sandbox Code Playgroud)

但不是

var a = 1S; // not possible, you must use (short)1;
Run Code Online (Sandbox Code Playgroud)

  • "简答"我看到你在那里做了什么 (25认同)
  • 我也会问圣诞老人`B`为'byte`,:) (19认同)
  • 那是不可接受的!我称小人的歧视!(他们是**短**,对......?) (6认同)
  • 是的,如果有一个单一的字母,为了保持一致性以及节省一些打字,那将是很好的. (3认同)

Eri*_*ert 24

这个问题有点令人困惑.我们来定义一些术语:

常量表达式被(粗略地说)编译器知道的一个表达式是一个特定的恒定值.

字面是一种特定类型的常量表达式; 123并且Math.PI都是常量表达式.前者是文字,后者不是.

常数字段是与一个常量表达式初始化的类型的成员,并且然后可以在其他地方用作常量表达式.Math.PI是一个常数字段的例子.

本地恒定就像一个恒定的领域,但作用范围的块.(就像局部变量的范围是一个块.)

常量字段和局部常量需要明确说明其类型; 常量没有"var"形式.(这个想法令人不寒而栗;"const var"显然是矛盾的.)

局部变量不需要说明其类型; 可以从初始化程序推断出类型.这种局部变量称为"隐式类型局部变量".

所以你的问题是"有没有办法写一个short类型的文字常量表达式,可用于初始化short类型的隐式类型局部变量?"

不,那里没有.您可以显式键入局部变量:

short s1 = 123;
Run Code Online (Sandbox Code Playgroud)

您可以显式键入本地常量:

const short s2 = 123;
Run Code Online (Sandbox Code Playgroud)

或者你可以创建一个包含一个强制转换的常量表达式:

var s3 = (short)123;
Run Code Online (Sandbox Code Playgroud)

或者您可以使本地或字段常量并将其名称用于隐式类型本地的初始化程序:

var s4 = s2;
Run Code Online (Sandbox Code Playgroud)

但是没有办法绕过它; short必须出现在某个地方,无论是在字段或本地声明中还是在演员表中.

  • @EricLippert我经常想知道为什么C#团队为某些数字原始类型而不是其他类型实现了后缀. (14认同)
  • 为什么短文字没有后缀? (5认同)
  • @gdoron:除了var之外还有其他理由.例如,你有两个方法M(int)和M(short),你想强制调用short重载:`M((short)123)`但没有强制转换.与成本相比,在该场景中消除演员阵容的好处很小.(在这种情况下,演员阵容可以说是更好的,因为它可以清楚地表明过度被称为过载.) (4认同)
  • @gdoron:默认情况下,所有功能都未实现,直到有人实现为止。短文字没有后缀,因为没有人设计、实现、测试和发布该功能。更具体地说:**为什么要有**?在 C# 1.0** 中为短文字添加后缀有什么引人注目的好处?缺少某项功能无需理由;如果您认为某个功能是个好主意,那么“想要”该功能的人必须证明它的合理性。理由是什么? (2认同)
  • 拥有简短的文字也会使代码像`short x = y <0吗?(short)0:(short)y`清洁器(`short x = y <0?0S:(short)y`) (2认同)

Ant*_*ram 10

shortC#中的数据类型没有后缀.如果希望整数文字为short,则需要显式声明类型并提供范围内的文字.

short s = 123;
Run Code Online (Sandbox Code Playgroud)

  • @gdoron,我不同意.我认为其含义更多的是关于*文字常量*,例如1,2或3,而不是语言结构中的常量`const short foo = SOMEVALUE;`.在十进制声明的上下文中查看它,我相信你会得出同样的结论. (4认同)
  • 他不是绝对正确的(大多数情况下都是如此),也许这个措辞可能会混淆,但我认为大多数答案(以及投票!)都表明更多的人推断出其他*而不是"const"的含义. (2认同)

Mar*_*ell 8

两种选择; 既不理想:

  1. 删除var,明确指定类型:

    short s = 123;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用强制转换语法(注意这是一个编译时操作,而不是运行时):

    var s = (short)123;
    
    Run Code Online (Sandbox Code Playgroud)

这是指定文字短片的唯一选项.