2012-03-15 49 views
0

SqlServer中我的一种数据类型是smallint,它映射到.NET中的shortInt16。我正在使用一个简单的循环与我是一个整数,它告诉我,它不能隐式地转换两者之间?为什么不能将.Net从short转换为int?

我只是想知道为什么这是不可能的?这是否仅仅是为了防止你使用大于短暂的数字?这对我来说似乎很奇怪,因为我大约80%确定我从来不必将int转换为long

样品:

public Int16 Test() 
{ 
    int i = 2; 
    return i; 
} 
+0

听起来可疑,你可以张贴演示问题的代码? – 2012-03-15 14:29:09

+0

因为在CLR类型中'long'大于'int',所以不需要将'int'转换为'long'。 – 2012-03-15 14:37:32

回答

5

隐式从shortint应该存在,因为你是从狭义要宽,宽窄不含蓄,因为潜在丢失数据的支持。编译器允许你忽略这个,但是在这些情况下请求你明确地陈述你已经理解了它的潜力并且你确定。

更新:

你的代码是一个狭窄的演员和不能被隐式进行。修复:

public Int16 Test() 
{ 
    int i = 2; 
    return (Int16)i; 
} 

虽然,在这种特殊情况下,编译器理论上可以知道不会发生数据丢失。对于其他99.99%的时间,它在编译时无法知道这一点,因此只有在可能发生数据丢失的情况下才支持显式转换。

这明确地向开发人员承担责任,使得当由于数据丢失而发生运行时错误时,开发人员必须事先有意识地做出该决定,并且没有合法地位向计算机投掷咒语。

VB.NET似乎允许您使用选项严格规避这种限制:

http://msdn.microsoft.com/en-us/library/k1e94s7e(v=vs.80).aspx

所以我想这是一个C#具体的设计选择。

+1

为了搭载Adam在这里所说的话,从一个较大的容器转移到一个较小的容器可以保证数据的丢失。明确地转换它会告诉编译器,你知道这个事实并且是故意的。 – 2012-03-15 14:31:02

+0

@DJQuimby Ta,稍微修改了我的答案。 – 2012-03-15 14:32:47

+0

@AdamHouldsworth我知道如何解决它。问题是为什么 – ediblecode 2012-03-15 14:34:30

1

隐式转换将仅在非收缩转换(以防止数据丢失)进行。

+0

我们正在讨论非缩减转换(short - > int) – 2012-03-15 14:29:45

+0

@JakubKonecki其实我们正在谈论int - > short – ediblecode 2012-03-15 14:32:25

+0

哈,如果只是问题从开始就是正确的...... ;-) – 2012-03-15 14:48:23

0

这取决于您使用的是哪种语言。

只要你不溢出你的Int16,VB就会默认转换没有问题。 如果启用选项严格,你将不得不自己做转换:Convert.ToInt16(yourInt32)

在C#中,你必须将它转换:(Int16)yourInt32

相关问题