为什么不自动推断?

时间:2016-04-13 15:54:39

标签: c# generics inferred-type

到目前为止,C#inferrence对我来说一直都很好。我已经创建了一个测试示例来简化案例。

$_SESSION ['percentage'] = (($_SESSION['wins']) / ($_SESSION['total'])) * 100 ;

我已经阅读了很多关于推理的内容,但我对此无效至关重要。

4 个答案:

答案 0 :(得分:4)

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

您的方法没有形式参数和零形式参数,因此不做推论。

请注意,特别是推断永远不会来自通用参数约束。约束不是方法的签名的一部分,并且推理涉及签名。而是在类型推断成功后检查约束。如果您期望从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/

对该博客的评论非常有趣。如果您曾经想要看到一百个人告诉我我错了,那么设计是错误的,实施是错误的,那就是这个地方。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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