c# - c#匿名对象,为什么有时只包含字段定义?
问题描述
为什么我可以在这里立即访问匿名对象属性:
public object ComputeStats()
{
var obj = new
{
avg = 2,
hi = 3,
lo = 1
};
Console.WriteLine(obj.avg);
return obj;
}
但不是在这里(编译器错误'object'不包含'avg'的定义):
public void DisplayStats()
{
object stats = ComputeStats();
Console.WriteLine("average: " + stats.avg);
}
一种解决方法是将 stats 声明为dynamic
,但大多数人会说只为该对象创建一个类/类型。我宁愿使用匿名对象,但不想为了方便而开始使用动态对象。
解决方案
这并不特定于匿名类型。一切都继承自object
这意味着您可以将任何内容隐式转换为object
.
调用返回匿名类型的方法并将其分配给声明为的变量object
与执行此操作相同:
object obj = new { avg = 2, hi = 3, lo = 1 };
object
没有 , 等属性avg
,hi
因此 Visual Studio 不会显示它们,如果您键入它们,它们将不会编译。
为了说明使用匿名类型以外的东西:
var s = "Hello!";
object o = s;
只有一个string
。两者都s
指o
一个string
. 但是s
被转换为 astring
并且o
被转换为object
.
所以你可以这样做:
var s = "Hello!";
object o = s;
var l = s.Length;
...但你不能这样做:
var s = "Hello!";
object o = s;
var l = o.Length; // object doesn't have a Length property.
如果你这样做:
var obj = new { avg = 2, hi = 3, lo = 1};
...usingvar
表示类型是推断出来的。无论您分配给它什么,这就是类型。在这种情况下,在幕后,编译器实际上是在创建一个新类型,因此它的行为就像您已经定义了具有这些属性的类型一样。
像这样的匿名类型在方法中使用很方便,但它们并不意味着在方法之间传递值。为此,类、结构或元组更好。
推荐阅读
- pandas - 加入有几行分配给表键的数据集 - 如何防止数量重复?
- javascript - 在 ng-model 上应用 parseFloat
- c++ - 有人可以告诉我这是如何在 main() 中实现的吗?(关于 void 指针的问题)
- azure - Service Fabric 单例服务在扩展时是否会停机?
- laravel - 我的 Laravel 路线不适用于 CentOS
- nlp - 使用经过训练的 K-Means 模型为未见数据预测正确的集群
- node.js - router.get 和 app.get 有什么区别?
- javascript - 如何使用 node.js 从 API 调用中打开数据并将数据写入文件
- mule - 在 Dataweave 2.0 中用空白替换 Null
- jquery - TS2702:“JQuery”仅指一种类型,但在此处用作命名空间