我知道我可以(隐含地)将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
,但效果是一样的。
答案 0 :(得分:1)
对于隐式类型(int
,float
等),您可以使用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