【问题标题】:Why isn't this inferred automatically?为什么这不是自动推断的?
【发布时间】:2016-08-04 20:38:04
【问题描述】:

到目前为止,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应该是什么类型。
  • 尝试使用参数,因为@DStanley 声明编译器没有什么可推断的。

标签: c# generics inferred-type


【解决方案1】:

泛型方法类型参数对方法类型参数的推断通过基于形式参数和形式参数。

你的方法有零个形参和零个形参,所以没有推论。

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

我已经阅读了很多关于推理的内容,但我不知道为什么这不起作用。

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

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

还有我以前的微软博客:

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/

那个博客的 cmets 很有趣。如果你曾经想看到一百个人告诉我我错了,设计错了,实现错了,好吧,那就是去的地方。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        对于该方法,您需要一个 T 类型的参数,以便编译器可以从中推断出应该用作 T 的参数。

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

        【讨论】:

          猜你喜欢
          • 2014-02-11
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 2012-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多