为什么C#无法推断转换?

时间:2019-09-20 02:37:36

标签: c# reflection casting type-conversion

所以我最近第一次开始使用反射,并发现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?为什么不推断类型是期望的结果,因为类型是已知的?

2 个答案:

答案 0 :(得分:1)

铸造是一种编译时功能。它告诉编译器您知道自己在做什么。直接分配作为您的第二个示例在运行时进行评估。

答案 1 :(得分:1)

在编译时不知道o是什么。使用此处不是Product的东西是完全有效的。

您的主要问题-...instead of just doing Product p = o-如果Product实现了隐式运算符怎么办?

public static implicit operator Product(object o)

然后,假设您要使用新的,宽松的转换语法-Product p = o,运行时将不知道使用隐式转换或转换来转换它的方式。也许这就是为什么不允许这种语法的原因。