我在SqlServer中的一种数据类型是smallint
,它在.NET中映射到short
或Int16
。我正在使用一个简单的for循环,我是一个int,它告诉我它不能隐式地在两者之间转换?
我只是想知道为什么这是不可能的?是否只是为了防止你使用比短期更多的数字?这对我来说似乎很奇怪,因为我大约80%确定我从未将int
转换为long
?
示例:
public Int16 Test()
{
int i = 2;
return i;
}
答案 0 :(得分:5)
从short
到int
的隐式存在应该存在,因为由于潜在的数据丢失,您无法隐式支持从窄到宽,从宽到窄。编译器允许您忽略这一点,但请求您在这些情况下明确 ,以表明您已了解其潜力并且您可以使用它。
<强>更新强>
您的代码是缩小版本,无法隐式执行。修正:
public Int16 Test()
{
int i = 2;
return (Int16)i;
}
虽然,在这种特殊情况下,编译器理论上可以知道不会发生数据丢失。对于其他99.99%的时间,它在编译时无法知道这一点,因此只有在可能发生数据丢失的情况下才支持显式转换。
这明显地将责任放在开发人员身上,以便当由于数据丢失而发生运行时错误时,开发人员必须先有意识地做出该决定,并且没有法律地位来在计算机上发出咒骂。
VB.NET似乎允许您使用Option Strict绕过这个限制:
http://msdn.microsoft.com/en-us/library/k1e94s7e(v=vs.80).aspx
所以我认为这是C#特定的设计选择。
答案 1 :(得分:1)
有一个预定义的从short到int的隐式转换,long, float,double或decimal。
http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx
答案 2 :(得分:1)
仅在非缩小转化时执行隐式转化(以防止数据丢失)。
答案 3 :(得分:0)
这取决于您使用的语言。
只要你没有溢出你的Int16,VB默认转换没有问题。 如果您启用Option Strict,则必须自行执行转换:Convert.ToInt16(yourInt32)
在c#中你必须施放它:(Int16)yourInt32