如果返回,则无法推断泛型类型

时间:2016-12-06 14:07:04

标签: c# generics extension-methods type-inference

我有一个非常简单的扩展方法(它可能不相关,虽然它是扩展名,对普通的方法也是一样):

public static T Content<T>(this HttpResponseMessage response)
{
    var content = (ObjectContent<T>) response.Content;
    return (T) content.Value;
}

现在我这样使用它:

MyContent content = response.Content();

但我得到的错误是该类型无法从使用中推断出来,所以我必须这样做:

MyContent content = response.Content<MyContent>();

这只是一个缺失的功能,它无法推断或我在这里做错了什么?即使没有明确说明,我也没有看到推断T属于MyContent类型的任何问题,但我当然没有编写编译器并且不了解所有细节

1 个答案:

答案 0 :(得分:3)

  

即使没有明确说明,我也没有看到T是MyClass类型的任何问题

嗯,问题是语言根本就没有指定。通用类型推断基于参数执行。方法调用表达式是一种始终具有类型的表达式 - 并且解析正在使用哪个方法重载以及泛型类型参数是建立该类型的一部分。如何使用结果只是重载解析或类型推断的一部分。

在执行来自匿名函数,方法组和空文字的转换时使用 - 这些表达式本身没有类型,但只能转换为适当的类型。

简而言之:您需要指定类型参数。

请注意,您无需编写编译器来获取所有详细信息 - 这就是语言规范的用途。最近发布的规范是C# 5