为什么C#是关键字,对于double,返回true,但是对于float,即使转换为float也可以为false?

时间:2015-07-25 21:04:17

标签: c# casting floating-point

动机:我有一个返回动态数据类型的方法。该值来自数据库,我知道该值将是float,double或string。如果它是一个字符串,我不想使用该值,所以我写了下面的代码:

if (value is float)
{
    myVariable = (float)value;
}

我的期望是这个代码会执行,无论实际类型的值是double还是float,因为'的文档中的以下片段是'关键字:

  

如果提供的表达式为非null,则表达式的计算结果为true,并且可以将提供的对象强制转换为提供的类型,而不会引发异常。

在此处找到:is (C# Reference)

但是,当类型为double时,(value为float)返回false,并且赋值不会执行。但是,我将代码更改为:

if (value is double)
{
    myVariable = (float)value;
}

并且当值的类型为double时它工作正常 - 即使根据文档我不能转换为float,因为(value is float)返回false。

我的问题:为什么(值为float)在值为double的情况下返回false(可以无异常地转换为float)?

编辑 - 展示的短节目

class Program
{
    static void Main(string[] args)
    {
        dynamic d = 1.0;
        Console.WriteLine(d is double);
        Console.WriteLine(d is float);
        float f = (float)d;
        Console.WriteLine(f);
        Console.ReadKey();
    }
}

3 个答案:

答案 0 :(得分:4)

是的,这是因为类型是dynamic。这基本上意味着float强制转换的含义取决于值的执行时间类型。

is运算符正在检查floatdouble是否属于同一类型 - 而且它们不是,这就是它返回false的原因。

但是,doublefloat的显式转换,这就是演员投放的原因。我不会使用那个MSDN C#引用来计算语言行为的更精细细节 - 语言规范通常是更好的选择。

答案 1 :(得分:0)

不确定,但我猜是因为没有隐式转换。见Implicit Numeric Conversions Table (C# Reference)

答案 2 :(得分:0)

您明确地将double值转换为float变量。这很好。 检查类型时,它是精确类型匹配。 你需要的是:

if (value is double || value is float)
{
    myVariable = (float)value;
}