如何在不强制转换的情况下指定简短的int文字?


77

有没有办法指定我的变量是short int?我正在寻找类似于M后缀的小数。对于小数,我不必说

var d = (decimal)1.23;

我可以这样写:

var d = 1.23M;

有没有办法写这个

   var s  = SomeLiteralWithoutCast

所以s暗示是int的缩写?


在您提到的情况下,它只会无故混淆类型。
哈罗德


如果它是常量,那么为什么要声明为变量?变量各不相同,这就是为什么它们被称为“变量”的原因;常数没有。
埃里克·利珀特

@EricLippert我认为他在混淆“常数”和“文字”。
phoog 2011年

@EricLippert:实际上我的意思是SomeLiteralWithoutCast。我解决了我的问题。
Arne Lund

Answers:


131

简短的回答,。在C#中,没有S可以使用的字母,因为var a = 123S这表明a类型是short。有LlongFfloatDdoubleMdecimal但不是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

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

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

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

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

一个局部常量就像一个恒定的领域,但作用范围的块。(就像局部变量的作用域是块一样。)

需要常量字段和局部常量来明确声明其类型;没有常量的“ var”形式。(这个想法使人不寒而栗;“ const var”显然是矛盾的。)

不需要局部变量来说明其类型;可以从初始化程序中推断出类型。这样的局部变量称为“隐式类型局部变量”。

因此,您的问题是“是否有一种方法可以编写可用于初始化short类型的隐式类型局部变量的short类型的文字常量表达式?”

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

short s1 = 123;

您可以显式键入局部常量:

const short s2 = 123;

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

var s3 = (short)123;

或者,您可以使local或field常量并将其名称用作隐式键入的local的初始化程序:

var s4 = s2;

但是没有办法解决它。short必须出现在字段,本地声明或演员表中的某个位置


6
为什么没有简短文字的后缀?
gdoron支持Monica 2011年

1
@gdoron:所有功能默认情况下都未实现,直到有人实现它们为止。简短文字没有后缀,因为没有人设计,实施,测试和交付该功能。更具体地说:为什么要有在C#1.0中为简短文字加上后缀有什么引人注目的好处?缺少功能并不需要证明。如果您认为某个功能是一个好主意,那么想要该功能的人就必须对其进行辩护。有什么理由?
埃里克·利珀特

5
@gdoron:除了var以外,还有其他理由。例如,您有两个方法M(int)和M(short),并且您想强制调用short重载:M((short)123)但不强制转换。与成本相比,在这种情况下消除强制转换的好处很小。(在那种情况下,转换可以说是更好的,因为它使调用哪个重载变得非常清晰。)
Eric Lippert

16
@EricLippert我经常想知道为什么C#团队为某些数字基本类型而不是其他类型实现后缀。
詹姆斯,

4
有短的文字也将作出这样的代码short x = y < 0 ? (short)0 : (short)y清洁(short x = y < 0 ? 0S : (short)y
克莱门特

10

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

short s = 123;

1
他要求一个const short,而不是一个变量。
gdoron支持Monica 2011年

4
@gdoron,我不同意。我相信含义更多地是关于字面常量,例如1、2或3,而不是就语言构造而言的常量const short foo = SOMEVALUE;。在十进制声明的上下文中查看它,我相信您会得出相同的结论。
Anthony Pegram

埃里克·利珀特(Eric Lippert)像我一样理解...看到他的评论。=)
gdoron支持Monica

2
他并非一无所差(大部分情况下都是这样),也许这句话可能会造成混淆,但我认为大多数答案(以及票数!)表明,除了之外,还有更多人推断出其他含义const
Anthony Pegram

8

两种选择;都不理想:

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

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

    var s = (short)123;
    

这是指定文字缩写的唯一选项。


1
实际上,他要求常量常量
gdoron在2011年

1
为什么第一选择不是理想的?
gdoron支持Monica 2011年

1
@戈登,我的意思是:在op的上下文中,该语法不希望使用该语法,而希望使用后缀语法,例如十进制(M)等
Marc Gravell

@Gordon(const / not)不会改变语法,但是
Marc Gravell

2

您可以使用以下内容:

var value = (short)123;

当然,这实际上没有任何意义,因为var的全部目的不是编写类型。


0

没有这样的事情,Implicitly const因此您将必须像这样将const定义为short:

const short x = 999;

在这里看到更多


2
给它一个标识符可能是一个主意。这不会编译。
亚当
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.