C#"implicit"垂头丧气?
C# "implicit" downcast?
是否可以在运行时获取较低的 class 继承而无需显式转换?
假设我们有三个 classes A
、B
和 C
.
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
。在我的真实情况下,我有大量的 B
s 和 C
s 从 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。
是否可以在运行时获取较低的 class 继承而无需显式转换?
假设我们有三个 classes A
、B
和 C
.
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
。在我的真实情况下,我有大量的 B
s 和 C
s 从 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。