我错过了什么?我没有在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。谢谢
答案 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
由于int
和short
无论如何都不会相互继承。
回答问题&#34; X是否适合Y&#34;,我不相信有内置的机制,因为通常你需要将答案烘焙到你的逻辑中。< / p>
如果您只是想知道答案,通常C#非常擅长提供与is
定义相匹配的隐式转化,而只提供明确的转化。
例如,您可以隐式地将int
转换为double
,因为它们是相同的,但因为每个int
都有一个完美的double
表示。
答案 2 :(得分:2)
short
是System.Int16
。 int
是System.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());
}