【问题标题】:C# "implicit" downcast?C#“隐式”沮丧?
【发布时间】:2015-04-07 23:02:19
【问题描述】:

是否可以在运行时不显式强制转换的情况下获得较低的继承类?

假设我们有三个类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,并且我有一些方法可以完成这项工作(我的意思是,这种“隐式”沮丧)。我必须在下面做这样的事情。

在某个地方:

A tmp = new C();

在其他地方:

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

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

【问题讨论】:

  • 你的问题对我来说没有多大意义,请重新表述...
  • Foo&lt;typeof(tmp).SomeMagicMethod()&gt;(tmp); 无效;泛型是一个编译时特性。 T 必须是编译时常量。
  • 你好@CommuSoft。我不知道如何更具体。让我试着总结一下我真正的问题。我有一个实现消费者/生产者线程模式的应用程序。在生产者线程中,我的示例中的列表被提供了我的继承树的一个高级对象,以便能够存储所有类型的继承。在我的消费者线程中,我想获取这些继承的基类引用,并隐式获取列表中引用的继承树中的派生类类型,以便能够正确调用应该接收最低派生的泛型方法类
  • 不是在编译时,你可以使用反射等。但这一切都很低效,而且是自找麻烦......
  • 我看到了@Blorgbeard。所以......您能否阅读我上面的评论并尝试阐明这个问题?非常感谢。

标签: c# .net casting implicit downcast


【解决方案1】:

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

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

Foo(tmp);

另见Great Eric Lippert's answer for related question

【讨论】:

  • 非常感谢。我没有看基础知识,呵呵。
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2012-12-17
  • 2015-01-22
相关资源
最近更新 更多