5

我知道我可以(隐式)将 aint转换为 a float,或将 afloat转换为 a double
另外,我可以(明确地)将 adouble转换为 afloat或 a 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 floatand f is int,但效果是一样的。

4

2 回答 2

1

对于隐式类型(int,float等),您可以使用 aTypeConverter来确定 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.

于 2013-08-18T01:51:47.860 回答
0

你可以试试这个-

//Type a and b stuff defined 
a c = null;
try
{
   c = (a)b;
}
catch{}
if(c==null)
   //Do stuff
于 2013-08-18T04:27:12.290 回答