为什么.Net不能从short转换为int?

时间:2012-03-15 14:25:22

标签: .net int

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

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

示例:

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

4 个答案:

答案 0 :(得分:5)

shortint的隐式存在应该存在,因为由于潜在的数据丢失,您无法隐式支持从窄到宽,从宽到窄。编译器允许您忽略这一点,但请求您在这些情况下明确 ,以表明您已了解其潜力并且您可以使用它。

<强>更新

您的代码是缩小版本,无法隐式执行。修正:

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