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

时间:2013-08-18 01:16:46

标签: c# casting

我知道我可以(隐含地)将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,但效果是一样的。

2 个答案:

答案 0 :(得分:1)

对于隐式类型(intfloat等),您可以使用TypeConverter来确定 a 类型的变量是否可以转换为类型 b'/ em>的。您可以使用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

答案 1 :(得分:0)

你可以试试这个 -

//Type a and b stuff defined 
a c = null;
try
{
   c = (a)b;
}
catch{}
if(c==null)
   //Do stuff