使用Is运算符和值类型C#

时间:2014-01-16 19:06:00

标签: c# casting typechecking

我错过了什么?我没有在stackoverflow上看到答案,但可能错过了它。对于

的情况,似乎“是”运算符应该起作用(即评估为真)
short j = 1;
int k = 2; 

if (j is int)
   Console.WriteLine("all values of j will fit into k");
else
   Console.WriteLine("all values of j will not fit into k");

我尝试使int和short nullable也没有用。条件成立的基本原理是short的所有值都适合int类型的变量(根据结果可能是错误的 - 即“If(j is in)”的计算结果为false。谢谢

4 个答案:

答案 0 :(得分:7)

  

条件成立的基本原理是short的所有值都适合int类型的变量。

你正拿着这本书The Hobbit的平装本,有人问你“你是拿着电影吗?”你说是的,因为有一部电影是由这本书制成的吗?或者你说“不,我拿着一本平装书,一本书不是电影。” ?

因为有一个对应于每个short的int不会使short成为一个int。 is运算符会告诉您您手头的东西特定类型,因此名称为“is运算符”。它没有告诉你是否有不同类型的东西恰好与你手头的东西相对应

答案 1 :(得分:6)

is表示"大致来自"

因此以下内容将返回true。

j is short
j is object
k is int
k is object

以下内容将返回false。

j is int
k is short

由于intshort无论如何都不会相互继承。

回答问题&#34; X是否适合Y&#34;,我不相信有内置的机制,因为通常你需要将答案烘焙到你的逻辑中。< / p>

如果您只是想知道答案,通常C#非常擅长提供与is定义相匹配的隐式转化,而只提供明确的转化。

例如,您可以隐式地将int转换为double,因为它们是相同的,但因为每个int都有一个完美的double表示。

答案 2 :(得分:2)

shortSystem.Int16intSystem.Int32。这是两种完全不同的结构。

答案 3 :(得分:1)

我创建了一个执行此类转换的简短函数。也许你可以从中推断出你需要的东西。

private boolean IsInteger(object expression)
{
    var numericTypes = new HashSet<Type>(
                                        {
                                             typeof(Byte),
                                             typeof(SByte),
                                             typeof(Int16),
                                             typeof(UInt16),
                                             typeof(Int32),
                                             typeof(UInt32)
                                        });
    return expression != null && numericTypes.Contains(expression.GetType());
}