gpt4 book ai didi

c# - 为什么我不能这样做 : dynamic x = new ExpandoObject { Foo = 12, Bar = "twelve"}

转载 作者:IT王子 更新时间:2023-10-29 03:45:42 32 4
gpt4 key购买 nike

是我做错了什么,还是下面的代码真的不可能?

dynamic x = new ExpandoObject { Foo = 12, Bar = "twelve" };

如果这真的不可能,是否有另一种单行方法来实例化具有两个属性的 ExpandoObject?

为什么 C# 团队会选择禁止使用与常规对象、匿名对象和可枚举/列表相同的初始化语法?

更新

我问这个问题是因为我试图向 Pearl 爱好者展示 C# 很酷的新动态特性,但后来我因无法执行我认为是 ExpandoObject 的逻辑实例化而停滞不前>。感谢 Hans Passant 的回答,我意识到 ExpandoObject 是不适合这项工作的工具。我的真正目标是使用 C# 的动态特性从一个方法返回两个命名值。正如 Hans 指出的那样,dynamic 关键字非常适合此目的。我不需要 ExpandoObject 及其所有开销来执行此操作。

因此,如果您想从一个方法中返回一对命名值,并且您不关心类型安全、智能感知、重构或性能,那么这非常有效:

public dynamic CreateFooBar()
{
return new { Foo = 42, Bar = "Hello" };
}

用法:

dynamic fooBar = CreateFooBar();
var foo = fooBar.Foo;
var bar = fooBar.Bar;

最佳答案

Am I doing something wrong, or is the following code really not possible?

这真的不可能。赋值运算符左边的东西必须是编译时已知的属性或字段,显然 expando 对象不是这种情况。

Why would the C# team opt to disallow the same initialization syntax as for regular objects, anonymous objects, and enumerables/lists?

您表述问题的方式表明存在逻辑错误。默认情况下不实现功能,然后我们四处奔走,几乎禁止所有这些功能,因为我们认为它们是个坏主意!默认情况下,功能未实现,必须实现才能工作。

实现任何功能的第一步是必须有人首先想到它。据我所知,我们从来没有这样做过。特别是,对于 2006 年设计对象初始值设定项的人来说,要知道我们将在 2010 年为语言添加“动态”并相应地设计功能是相当困难的。功能总是由及时向前而不是向后的设计师设计的。我们只记得过去,不记得 future 。

无论如何,这是个好主意,谢谢分享。既然有人已经想到了,我们就可以开始下一步了,比如决定它是否是我们可以花费有限预算的最佳想法,设计它,编写规范,实现它,测试它,记录它以及将其运送给客户。

我不希望任何事情很快发生;我们有点忙于上周在 Build 上宣布的整个异步和 WinRT 业务。

关于c# - 为什么我不能这样做 : dynamic x = new ExpandoObject { Foo = 12, Bar = "twelve"},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478048/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com