C#"implicit"垂头丧气?

C# "implicit" downcast?

是否可以在运行时获取较低的 class 继承而无需显式转换?

假设我们有三个 classes ABC.

class A {
    int _a;
}

class B : A {
    int _b;
}

class C : A {
    int _c;
}

我在代码中的某处有一个通用方法。

void Foo<T> (T t) where T : A;

在这种情况下,我有对象 A 的引用列表,但我必须调用 Foo 并将实例的较低对象类型传递给 Foo。在其他方法中,此列表由 B 的某些实例和 C 的其他实例的 A 引用提供。

我希望能够在不进行显式转换的情况下使用较低级别的实例调用 Foo。在我的真实情况下,我有大量的 Bs 和 Cs 从 A 继承,我有一些方法可以完成这项工作(我的意思是,这个 "implicit" 沮丧)。我必须在下面做这样的事情。

在某个地方:

A tmp = new C();

其他地方:

Foo<typeof(tmp).SomeMagicMethod()>(tmp);

Type.SomeMagicMethod 应该是我可以用来隐式获取 "tmp" 的较低级别的任何内容。

快速回答,您不能为 C# 中的泛型提供非显式 type。这是设计使然,因为您必须提供有关您在方法中提供的变量类型的完整信息。

另一方面,您可以删除方法的 generic 部分,并在没有类型参数的情况下调用它。由于您已经为 tmp 提供了类型,编译器将使用该信息进行泛型类型选择:

Foo(tmp);

另见 Great Eric Lippert's answer for related question