2010-03-08 58 views

回答

6

可以从方法返回一个匿名类型的实例 - 但是因为你不能命名它,所以你不能声明该方法将返回什么,所以你必须声明它返回只是object。这意味着调用者不会对属性等具有静态类型的访问权限 - 虽然他们仍然可以传递实例,通过反射(或在C#4中动态输入)访问它。

我个人很喜欢的C#未来版本允许你写一个非常简短的类声明产生相同的代码(不可变的性质,构造,的Equals/GetHashCode的/的ToString)与名称...

一个 grotty hack去绕它,叫casting by example。我不会推荐它。

+0

...你今天可以用CodeRush,非常方便。是否有任何理由希望将它包含在语言中而不是VS中? –

+1

@Johannes:是的,可维护性。我希望能够保持*简单*形式。 *能力*将类型扩展为完整的代码,所以我可以添加额外的功能当然非常方便,但除此之外还有更多。再举一个例子,想象一下,如果我们没有'using'语句,但是VS宏会产生相应的try/finally块 - 就像在语言中使用'statement'一样好,在你的视图? –

+0

听起来很合理。所以你基本上提出一个“仅数据类”构造? –

1

因为匿名类型没有名字。因此你不能为方法声明返回类型。

+0

所以你会使用'var' –

1

因为C#是静态类型语言和静态类型语言需要在编译时已知的方法的返回类型和匿名类型没有名字。

1

你怎么能使用你的类型的方法中,如果定义仅在方法的调用?

这不是javascript。

+1

我没有看到你从问题中得到这个答案... –

0

至少高达3.5,匿名类型实际上是在编译时解析,而这是不可能的(或相当硬)与匿名方法签名做。

1

很多答案heere似乎indicatie,这是因为目前的语法和规则不可能的。但问题是要改变它们。我认为这是可能的,但有点复杂,并导致一个尴尬的(容易出错的)语法。像

var f() { return new { A = "*", B = 1 }; } 

var x = f(); 

问题是这是否增加了足够的价值,以使其值得。

+1

首先,“var”的意思是“变量”,所以我会觉得做一个返回类型不好,不是一个变量,比如说“var”。其次,这会使编译器的设计复杂化。可行,但比天真地想象的要多得多。请参阅http://blogs.msdn。com/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx对此有些想法。 –

相关问题