设计决定倾向于不从方法返回匿名类型?为什么匿名类型不能在方法中传递?
回答
你可以从方法返回一个匿名类型的实例 - 但是因为你不能命名它,所以你不能声明该方法将返回什么,所以你必须声明它返回只是object
。这意味着调用者不会对属性等具有静态类型的访问权限 - 虽然他们仍然可以传递实例,通过反射(或在C#4中动态输入)访问它。
我个人很喜欢的C#未来版本允许你写一个非常简短的类声明产生相同的代码(不可变的性质,构造,的Equals/GetHashCode的/的ToString)与名称...
有一个 grotty hack去绕它,叫casting by example。我不会推荐它。
...你今天可以用CodeRush,非常方便。是否有任何理由希望将它包含在语言中而不是VS中? –
@Johannes:是的,可维护性。我希望能够保持*简单*形式。 *能力*将类型扩展为完整的代码,所以我可以添加额外的功能当然非常方便,但除此之外还有更多。再举一个例子,想象一下,如果我们没有'using'语句,但是VS宏会产生相应的try/finally块 - 就像在语言中使用'statement'一样好,在你的视图? –
听起来很合理。所以你基本上提出一个“仅数据类”构造? –
因为匿名类型没有名字。因此你不能为方法声明返回类型。
所以你会使用'var' –
因为C#是静态类型语言和静态类型语言需要在编译时已知的方法的返回类型和匿名类型没有名字。
你怎么能使用你的类型的方法中,如果定义仅在方法的调用?
这不是javascript。
我没有看到你从问题中得到这个答案... –
至少高达3.5,匿名类型实际上是在编译时解析,而这是不可能的(或相当硬)与匿名方法签名做。
很多答案heere似乎indicatie,这是因为目前的语法和规则不可能的。但问题是要改变它们。我认为这是可能的,但有点复杂,并导致一个尴尬的(容易出错的)语法。像
var f() { return new { A = "*", B = 1 }; }
var x = f();
问题是这是否增加了足够的价值,以使其值得。
首先,“var”的意思是“变量”,所以我会觉得做一个返回类型不好,不是一个变量,比如说“var”。其次,这会使编译器的设计复杂化。可行,但比天真地想象的要多得多。请参阅http://blogs.msdn。com/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx对此有些想法。 –
- 1. 传递匿名类型VB.NET
- 2. LINQ中,VB - 匿名类型不能转换为匿名类型
- 3. 在ASP.NET MVC中传递匿名类型
- 4. 如何将匿名类型作为参数传递给方法?
- 5. 将匿名类型作为方法参数传递
- 6. 为什么我无法将匿名类型作为参数传递给函数?
- 7. 为什么我不能在Java中调用添加到匿名类的方法?
- 8. 为什么匿名类方法调用方法时不能执行aop?
- 9. 传递匿名类
- 10. 传递匿名类
- 11. 为什么我不能在Scala中为匿名函数指定结果类型?
- 12. 不能匿名类型传递给通用构造
- 13. 为什么我不能使用那样的匿名方法?
- 14. 为什么在匿名方法中不允许out参数?
- 15. 什么是C#中的匿名类型?
- 16. 为什么EF4中的匿名类型与LINQ to SQL不同?
- 17. 为什么使用匿名类型而不是创建类
- 18. 传递一个匿名方法到ProgressBar.Invoke()
- 19. 为什么泛型类型不能传播到所有的类方法?
- 20. 我对匿名方法类型使用什么通用约束?
- 21. 在C#中,为什么匿名方法不能包含yield语句?
- 22. 为什么我的匿名方法不能在循环中工作?
- 23. 匿名类型(类功能)
- 24. 为什么在声明常量时不能使用C#匿名类型?
- 25. 什么是C#中的匿名方法?
- 26. 为什么.Net 1.1中不支持匿名方法?
- 27. 在匿名内部类中调用方法是什么?
- 28. 为什么方法返回类型不包含在方法签名中?
- 29. 在参数中传递类名/方法名,可能吗?
- 30. 为什么匿名类型不像ExpandoObject那样动态?
因为我们会回来与VB的变种类型! ;) –
也许是因为人们在编写代码时不会声明任何名为“数据类型”的东西,代码审查人员可能会秃顶! – asyncwait