C# 方法是否可以使用自动变量来推断返回类型? IDictionary myMethod() { var returnVal=。。。; 返回值; }

C# 方法是否可以使用自动变量来推断返回类型? IDictionary myMethod() { var returnVal=。。。; 返回值; },c#,.net-4.5,C#,.net 4.5,看起来这应该是可能的——创建一个自动接受方法返回类型的var——但是我找不到任何与此匹配的关键字。它存在吗?以您尝试的方式创建对象将不起作用。变量的类型是在声明时确定的-编译器不关心如何使用它(在大多数情况下)。因此,返回它并不意味着编译器会自动推断初始类型 Wjdavis15的答案(显然现在已经被删除了——它使用了泛型并将返回值初始化为default(T))有点有效,但它非常有限。它适用于值类型,但引用类型变量将初始化为null。。。这是非常无用的,除非你打算首先返回null。相反,您可以这样

看起来这应该是可能的——创建一个自动接受方法返回类型的var——但是我找不到任何与此匹配的关键字。它存在吗?

以您尝试的方式创建对象将不起作用。变量的类型是在声明时确定的-编译器不关心如何使用它(在大多数情况下)。因此,返回它并不意味着编译器会自动推断初始类型

Wjdavis15的答案(显然现在已经被删除了——它使用了泛型并将返回值初始化为
default(T)
)有点有效,但它非常有限。它适用于值类型,但引用类型变量将初始化为null。。。这是非常无用的,除非你打算首先返回null。相反,您可以这样做:

IDictionary<int,string> myMethod()
{
 var returnVal = ...;

 return returnVal;
}
private T MyMethod(),其中T:new()
{
var retVal=newt();
...
返回返回;
}
//使用如下方法:
var dict=MyMethod();
只要T有一个无参数构造函数,这就可以工作。当然,这个方法的问题在于它是泛型的,这意味着它可以用于任何类类型,而不仅仅是您想要的一个特定类。最好使用非泛型方法


总之,不,您描述的功能在C#中不存在。有一些变通方法与您想要做的类似,但以您想要的方式使用它们既麻烦又混乱,因此最好只定义声明中的变量

如果递归调用该方法,则可以使用一个局部变量来推断该方法返回值的类型

private T MyMethod<T>() where T : new()
{
    var retVal = new T();
    ...
    return retVal;
}

// Use the method like so:
var dict = MyMethod<IDictionary<int,string>>();

当然,这会迫使你递归调用这个方法。

“它存在吗?”不存在。哦,天哪,一开始这让我笑了起来。但仔细想想,这实际上是“男孩先生”想要的。虽然我从不推荐this@stt106您可以使它不无限循环,就像您对任何其他递归方法所做的那样;这纯粹是为了说明你可以推断出一个局部变量作为方法的返回类型。看起来真正的答案只是“不”-我想知道是否有一些特殊的
ReturnType
auto-type,就像我在某种语言或其他语言中看到的那样。@Mr.Boy我发布了一个答案,提供了一个推断方法返回类型的局部变量的解决方案,因此答案显然不是“否”。您的解决方案要求我更改方法签名,因此,虽然这在技术上是一件有趣的事情,但我认为“不是真的,但这里有一种有趣的方法,你可以强制它”更准确——它类似于使用反射来查找方法返回类型,然后实例一个对象;不实用,但理论上可行!
public static int Foo()
{
    var bar = Foo();
    return bar;
}