所以我最近第一次开始使用反射,并发现GetType()知道对象的原始类型,即使它只是作为对象存储。
foreach(object o in (IEnumerable) property.GetValue(element))
{
List(o, verbose, int.MaxValue, subIncludes[attribute.Name], indents + 4);
}
因此,这里实际上是将o传递给泛型方法。我发现传入后,o.GetType();返回实际的类类型,而不是让我惊讶的System.Object。为了论证,可以说类型为Product。因此,如果类型已知,为什么有必要像这样Product p = (Product) o;
将o强制转换为Product而不是仅仅进行Product p = o
?为什么不推断类型是期望的结果,因为类型是已知的?
答案 0 :(得分:1)
铸造是一种编译时功能。它告诉编译器您知道自己在做什么。直接分配作为您的第二个示例在运行时进行评估。
答案 1 :(得分:1)
在编译时不知道o
是什么。使用此处不是Product
的东西是完全有效的。
您的主要问题-...instead of just doing Product p = o
-如果Product
实现了隐式运算符怎么办?
public static implicit operator Product(object o)
然后,假设您要使用新的,宽松的转换语法-Product p = o
,运行时将不知道使用隐式转换或转换来转换它的方式。也许这就是为什么不允许这种语法的原因。