C#"隐含"沮丧?

时间:2015-04-07 23:02:19

标签: c# .net casting implicit downcast

是否可以在没有显式转换的情况下在运行时获取较低的继承类?

假设我们有三个课程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实例的较低对象类型。在其他方法中,此列表包含A的某些实例和B的其他实例的C引用。

我希望能够在没有显式转换的情况下使用较低级别的实例调用Foo。在我的实际情况中,我有大量的BC继承自A,我有一些方法可以做这项工作(我的意思是,这个&#34 ;隐含&#34;垂头丧气)。我必须在下面做这样的事情。

在某些地方:

A tmp = new C();

在其他地方:

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

Type.SomeMagicMethod应该是我可以用来隐式获得&#34; tmp&#34;的较低级别的任何内容。

1 个答案:

答案 0 :(得分:1)

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

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

Foo(tmp);

另见Great Eric Lippert's answer for related question