是否存在" public var Method()"?

时间:2014-05-12 03:09:27

标签: c# var type-inference

我做了一些研究,到目前为止一无所获。

public var Method()
{
    //Do something
}

3 个答案:

答案 0 :(得分:14)

您可以使用dynamic

public dynamic Method() {
}
然而,你可能应该重新思考你的设计。您使用此方法的消费者知道您传递的类型。因此,您可以将其拆分为具有预期类型的​​单个方法。你要编写的逻辑量只是为了确保你所返回的内容是你所期望的意味着用适当的类型分割函数是不那么重要。

此外,dynamicvar不同。 dynamic表示“任何东西”...... var表示“在此任务的另一方宣布的任何内容”。由于您无法在方法返回值的上下文中使用var(它不是赋值),因此唯一的选项是dynamic。当你可以从方法中返回“任何东西”时,你的代码就会对错误开放。

TLDR :你让自己陷入困境。不要这样做。

答案 1 :(得分:3)

不,没有。根据规范,仅允许在本地变量声明的上下文中使用标识符var进行隐式类型。 Eric Lippert关于why var is not valid for fields的文章提出了在局部变量上下文之外实现它的许多问题,这些问题也适用于在方法签名中使用它。提出了两个问题:

  1. 由于许多编译器的重载解析算法都是在假设所有顶级类型都已知的情况下编写的,因此它在顶层的类型分析显着复杂化。
  2. var字段的推断类型可以是匿名类型,并且没有关于如何跨程序集统一这些类型的标准。
  3. 正如文章中指出的那样,这些并非难以克服的问题,但它们表明在局部变量声明之外实施var可能会产生大量成本。这篇文章写于2009年,也许在Roslyn编译器中更容易实现。

答案 2 :(得分:1)

来自documentation

  

从Visual C#3.0开始,在方法中声明的变量   scope可以有一个隐式类型var。隐式键入的本地   变量是强类型的,就像你声明了类型一样   你自己,但编译器确定了类型。 i的以下两个声明在功能上是等效的:

var i = 10; // implicitly typed 
int i = 10; //explicitly typed

如果您的函数具有public var Method()签名,则返回类型不会隐式表示,因此编译器无法确定其上的类型。

所以,问题的答案是:不,这样的签名不会编译......