知道类型A的变量是否可以强制转换为类型B

本文关键字:类型 转换 是否 变量 | 更新日期: 2023-09-27 18:28:14

我知道我可以(隐式)将int强制转换为float,或将float强制转换为double
此外,我可以(显式地)将double强制转换为floatint

这可以通过以下例子来证明:

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 floatf is int,但效果是一样的。

知道类型A的变量是否可以强制转换为类型B

对于隐式类型(intfloat等),可以使用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