Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么匿名类型不能传递给方法?_C# - Fatal编程技术网

C# 为什么匿名类型不能传递给方法?

C# 为什么匿名类型不能传递给方法?,c#,C#,不从方法返回匿名类型的设计决策是什么 您可以从一个方法返回一个匿名类型的实例,但是由于您不能命名它,您无法准确声明该方法将返回什么,因此您必须声明它只返回对象。这意味着调用者将不具有对属性等的静态类型化访问——尽管他们仍然可以传递实例,通过反射(或C#4中的动态类型)访问它 就我个人而言,我非常希望C#的未来版本能够允许您编写一个非常简短的类声明,该声明生成相同的代码(不可变属性、构造函数、Equals/GetHashcode/ToString),并带有一个名称 这里有一个很糟糕的黑客,叫做。但

不从方法返回匿名类型的设计决策是什么

您可以从一个方法返回一个匿名类型的实例,但是由于您不能命名它,您无法准确声明该方法将返回什么,因此您必须声明它只返回
对象
。这意味着调用者将不具有对属性等的静态类型化访问——尽管他们仍然可以传递实例,通过反射(或C#4中的动态类型)访问它

就我个人而言,我非常希望C#的未来版本能够允许您编写一个非常简短的类声明,该声明生成相同的代码(不可变属性、构造函数、Equals/GetHashcode/ToString),并带有一个名称


这里有一个很糟糕的黑客,叫做。但是我不推荐它。

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

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

如果定义仅在方法调用中,如何在方法内使用类型


它不是javascript。

至少在3.5之前,匿名类型实际上是在编译时解析的,而这对于匿名方法签名来说是不可能的(或相当困难的)。

许多答案似乎表明,由于当前的语法和规则,这是不可能的。但问题是如何改变它们。我认为这是可能的,但有点复杂,导致语法笨拙(容易出错)。像

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

var x = f();

问题是,这是否为语言增加了足够的价值,使其值得使用。

因为我们将返回VB的变体类型!;)也许是因为人们在编写代码时不会声明任何称为“数据类型”的东西,而代码审阅者可能会变得秃顶!!。。。今天你可以用CodeRush来实现,非常方便。你有什么理由希望在语言中包含这个而不是VS吗?@Johannes:是的,可维护性。我希望能够维护简单的表单。将类型扩展到其完整代码中,这样我就可以添加额外的功能,这当然很方便,但它还有更多的功能。再举一个例子,想象一下,如果我们没有
using
语句,但是VS宏会生成等效的try/finally块,那么在您看来,这是否与在语言中使用
语句一样好?听起来很合理。那么你基本上是在提出一个“仅数据类”的结构吗?@Johannes:是的。可能在理想的情况下,您可以添加额外的方法(但不是字段),而不进行扩展-当然,扩展方法也会做同样的事情。首先,“var”表示“variable”,所以我会对创建一个返回类型感到不安,它不是一个变量,比如“var”。其次,这将使编译器的设计变得非常复杂。这是可行的,但要比人们天真地想象的多得多。看看有什么想法。