【问题标题】:Inferring generic types from one method to another从一种方法推断泛型类型到另一种方法
【发布时间】:2011-10-06 09:15:02
【问题描述】:

我正在寻找一种方法来做到这一点:

var instanceOfMyClass = new MyClass();

instanceOfMyClass.AMethod<AType>(x => x.AnotherMethod(y => y.PropertyOfATypeClass));

我可以这样做,但我需要明确指定另一个类的类型,如下所示:

instanceOfMyClass.AMethod<AType>(x => x.AnotherMethod<AType>(y => y.PropertyOfATypeClass));

有没有不需要重写 AType 的方法?

目前为止,AnotherMethod 签名是:

AnotherMethod<T>(Expression<Func<T, object>>)

在哪里

<T> 

与“AMethod”中的 AType 相同

“AnotherMethod”与“AMethod”在同一个类中定义。

我需要 AMethod 的签名。

【问题讨论】:

  • 请提供MyClass.AMethodMyOtherClass.AnotherMethodMyOtherOtherClass.PropertyofATypeClass的签名(我不知道MyOtherClassMyOtherOtherClass类型的名称实际上是什么,因为我可以' t 在你的 lambda 表达式中告诉 xy 的类型)。
  • AMethod() 作为参数的委托的定义是什么?
  • 泛型类型推断是基于参数的——我们需要一个非常清晰的例子才能看到......
  • 问题是“那些签名方法是什么?”
  • 我们真的需要比这更多的代码。 AMethod 的签名是什么?是否在 AType 中定义了 AnotherMethod?

标签: c# .net generics types


【解决方案1】:

您似乎遇到了 C# 类型推理引擎的限制之一。

问题的关键在于,在方法组类型推断的一般情况下,为了对采用泛型委托的方法的参数进行类型推断,编译器需要知道方法签名(以确定哪些类型代表有重载);但是要确定方法签名,它需要知道您的委托参数的类型。因此,编译器有可能进入循环过程。为了避免这种情况,编译器甚至不会尝试进行推理。

如需更准确、详细且写得好的解释,see this blog post.

我认为简短的回答是,不,没有办法避免重新指定泛型类型。

【讨论】:

  • 不过,部分原因取决于他的代码结构。显然这对他不起作用,但我想知道他是否可以以不同的方式重组他的代码以允许推理引擎为他工作(尽管我们需要先查看他的代码......)
  • 请注意,我们确实在 C# 4 中对该算法进行了一些改进。我应该更新该博客文章以澄清。也就是说,我同意在这种情况下,问题无法通过类型推断来解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
相关资源
最近更新 更多