动机:我有一个返回动态数据类型的方法。该值来自数据库,我知道该值将是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();
}
}
答案 0 :(得分:4)
是的,这是因为类型是dynamic
。这基本上意味着float
强制转换的含义取决于值的执行时间类型。
is
运算符正在检查float
和double
是否属于同一类型 - 而且它们不是,这就是它返回false的原因。
但是,是从double
到float
的显式转换,这就是演员投放的原因。我不会使用那个MSDN C#引用来计算语言行为的更精细细节 - 语言规范通常是更好的选择。
答案 1 :(得分:0)
不确定,但我猜是因为没有隐式转换。见Implicit Numeric Conversions Table (C# Reference)
答案 2 :(得分:0)
您明确地将double值转换为float变量。这很好。 检查类型时,它是精确类型匹配。 你需要的是:
if (value is double || value is float)
{
myVariable = (float)value;
}