知道类型A的变量是否可以强制转换为类型B
本文关键字:类型 转换 是否 变量 | 更新日期: 2023-09-27 18:28:14
我知道我可以(隐式)将int
强制转换为float
,或将float
强制转换为double
此外,我可以(显式地)将double
强制转换为float
或int
。
这可以通过以下例子来证明:
int i;
float f;
// The smaller type fits into the bigger one
f = i;
// And the bigger type can be cut (losing precision) into a smaller
i = (int)f;
问题是这些类型不是一个接一个继承的(int
不是float
的子类型,反之亦然)
他们实现了隐式/显式强制转换运算符或类似的操作。如果没有,它的工作方式就像…
我的问题是:如何检查类型a的变量是否可以强制转换为类型B。
我尝试过i.GetType().IsAssignableFrom(f.GetType())
,但Type.IsAssignableFrom(Type)
只检查继承和接口(也许还有更多),但不检查实现的强制转换运算符
我试过i is float
和f is int
,但效果是一样的。
对于隐式类型(int
、float
等),可以使用TypeConverter
来确定a类型的变量是否可以转换为b。您可以使用TypeDescriptor.GetConverter
(System.ComponentModel)的一个重载找到对适当类型转换器的引用
对于自定义或其他引用类型,我建议使用Type.IsAssignableFrom
(如问题中所述)。这种方法的正确使用是:
var implType = typeof(List<>);
if (typeof(IEnumerable).IsAssignableFrom(implType))
Console.WriteLine("'{0}' is convertible to '{1}'", implType, typeof(IEnumerable));
上面的示例将告诉您类型List<T>
是否可转换为IEnumerable
。
你可以试试这个-
//Type a and b stuff defined
a c = null;
try
{
c = (a)b;
}
catch{}
if(c==null)
//Do stuff