Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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#_.net_Mono_Anonymous Types_Anonymous Class - Fatal编程技术网

C# 为什么不能将字段和属性声明为匿名类型?

C# 为什么不能将字段和属性声明为匿名类型?,c#,.net,mono,anonymous-types,anonymous-class,C#,.net,Mono,Anonymous Types,Anonymous Class,我在工作中遇到了一个问题,那就是将软件从FlashAS3移植到.NET/Mono。在AS3代码库中,我可以找到许多初始化如下的对象声明: private const MAPPING:Object = { ssdungf:'flydung', ssdungt:'flydung', superfutter:'superfeed' } var MAPPING = new { ssdungf = "flydung", ssdungt = "flydung",

我在工作中遇到了一个问题,那就是将软件从FlashAS3移植到.NET/Mono。在AS3代码库中,我可以找到许多初始化如下的对象声明:

private const MAPPING:Object =
{
    ssdungf:'flydung',
    ssdungt:'flydung',
    superfutter:'superfeed'
}
var MAPPING = new
{
    ssdungf = "flydung",
    ssdungt = "flydung",
    superfutter = "superfeed"
};
对我来说,最好的选择是在C中使用匿名类型,如下所示:

private const MAPPING:Object =
{
    ssdungf:'flydung',
    ssdungt:'flydung',
    superfutter:'superfeed'
}
var MAPPING = new
{
    ssdungf = "flydung",
    ssdungt = "flydung",
    superfutter = "superfeed"
};
问题是。。。让我引用MSDN:

不能将字段、属性、事件或方法的返回类型声明为具有匿名类型

但他们没有说为什么

所以问题仍然存在:为什么不能将字段和属性声明为匿名类型?为什么.NET创建者将其从该选项中删除

我从这里得到了警告,所以我的问题似乎是主观的,但我认为根本不是——这需要有客观的原因

至于我,我没有看到任何障碍,但不知何故,这是不支持的。因为编译器可以很容易地为类的字段或属性生成类型,就像它为局部变量生成类型一样

我的选择是使用动态类型,但不幸的是,我正在使用的单引擎是从中剥离出来的

另外,我可以选择使用对象类型并使用后期反射来查找以下字段:

 private static readonly object MAPPING = new
 {
     ssdungf = "flydung",
     ssdungt = "flydung",
     superfutter = "superfeed"
 };
但使用反射是我认为这种情况是肮脏的

我试图找到答案,但我真的没有找到任何答案。以下是一些类似问题的答案,但它们无法回答原因:


Anonymous属性的问题是:如何获取/设置它

假设它能起作用:

class MyClass
{
    public MyField = new { TheValue = "Hello World" };
}
现在,在您的消费代码中,您可以编写代码来读取代码:

MyClass m = new MyClass();
m.MyField.TheValue = "newValue";
这与MyField的类型有何不同?你所能得到的是,你可以省略两三行代码,而什么也得不到。但我认为你可能会产生很多问题,因为没有人知道他可以分配给该成员什么/期望从该成员那里得到什么

此外,你不能对匿名对象做太多的事情,基本上你可以设置它并读取它。除了从对象继承的Equals和GetHashCode之外,没有其他方法可以调用,所以机会非常少

最后但并非最不重要的一点是,匿名对象通常作为临时对象使用,例如在Select语句中。当您使用它时,您会说:这种类型将仅在当前特定范围内使用,并且可以作为内部实现细节被整个世界忽略。创建匿名类型的属性将向外部公开此类详细信息。当然,你可能会争辩说,设计师至少可以允许私人成员使用它们,但我想这样做会绕过可访问性的完整概念

为什么不能将字段和属性声明为匿名类型

因为C是静态类型的,所以任何内存位置都必须给定一个类型,而声明就是这样做的。对于局部变量,我们可以从上下文推断它是否与var声明同时初始化,但这是类型的简写,即使该类型没有名称也可以使用

具有匿名类型的字段(即静态绑定但无法描述的类型)意味着什么


动态与你正在移植的代码确实是最接近的,但是因为这对你来说是不可用的,你可能会考虑使用IDICIOTION,顺便说一下,ExpPotoObjor是如何使用的,它经常使用动态的对象,它的行为更像JavaCRPT对象,在幕后工作。与为所需对象创建类相比,这将更慢,类型安全性也更低,但可以工作。

@himbrombeer是真的,我没有考虑过,但字段仍然保留。感谢您的回答,我觉得这是最有价值的。您之所以编写,是因为C是静态类型的,所以任何内存位置都必须给定一个类型,声明也是这样做的,但编译器可以使用相同的技巧创建隐藏类型,并且内存位置将具有一个类型。也许我不完全理解你的答案,但那在使用它的代码中意味着什么呢?有件事你不知道怎么在某个地方用?好的,我们可以使用var,但是对于程序员来说,当他们不知道它是什么类型时,除了查看一些可能不可用的源代码之外,仍然没有什么价值。另一种方式是,我们总是关心字段或任何其他成员是什么类型。匿名性不管是匿名类型、匿名函数还是其他什么,都可以通过消除我们不关心的细节来简化我们的生活,因此只有在我们真正不关心的时候才有用。谢谢,你的最后一点很好。但你认为这就是.NET创作者不让他们这么做的原因吗?@JerrySwitalski,只有他们才会知道。