为什么这不是自动推断的?

Why isn't this inferred automatically?

到目前为止,C# 推理对我来说一直很有效。我创建了一个测试示例来简化案例。

class Parent
{
    public void InferrenceTesting<T>() where T : Parent
    {

    }
}

class Child : Parent
{
    public void Test()
    {
        //this line gives me a compiler error : The type arguments for method 'Parent.InferrenceTesting<T>()' cannot be inferred from the usage. Try specifying the type arguments explicitly.
        this.InferrenceTesting();
    }
}

我读了很多关于推理的书,但我不知道为什么这不起作用。

编译器没有可推断的信息 - 您需要一个参数或一些其他信息来告诉编译器 T 应该是什么以便推断它。

没有任何东西可以用来推断类型。您已经说过 T 必须是 Parent 的一种类型,但是由于您没有传递该类型的参数(编译器可以使用它来推断类型),因此您必须明确命名类型。

我不是这方面的专家,但我认为没有可以从.推断

这个方法在 Parent 派生中声明的简单事实与它无关。

您需要为该方法提供类型为 T 的参数,以便编译器可以从中推断出应该用作 T.

的内容

在您的通话中,T 不需要ParentChild。它可以是 任何东西 只要它继承自 Parent.

泛型方法类型参数对方法类型参数的推断通过基于之间的关系进行推断来进行]形式参数形式参数

您的方法有零个形式参数和零个形式参数,因此没有进行任何推论。

请注意,特别是 永远不会从通用参数约束 进行推断。约束不是方法的 签名 的一部分,推理本身与签名有关。相反,在 类型推断成功后 检查约束。如果您期望从 where 子句中得出某种推论,那么您的期望是错误的。

I have read quite a lot on inference, but I am clueless as of why this doesn't work.

如果您对此主题感兴趣,不妨阅读我关于类型推断的博客文章。它们可能比您读过的有关该主题的其他一些文章更准确;我偶尔会看到错误的信息。来自我当前的博客:

https://ericlippert.com/category/csharp/type-inference/

还有我以前的 Microsoft 博客:

https://blogs.msdn.microsoft.com/ericlippert/tag/type-inference/

具体参见

https://blogs.msdn.microsoft.com/ericlippert/2009/12/10/constraints-are-not-part-of-the-signature/

那个博客的评论很有意思。如果你曾经想看到一百个人告诉我我错了,设计错了,实现错了,那么,那就是你要去的地方。