在C#4.0中,类属性/字段是否可以是匿名类型?
例如: 注意:上面的内容既不能编译也不能工作(这里不能使用var),它只是为了说明我的观点 更新:为了澄清这个问题,我已经尝试使用在C#4.0中,类属性/字段是否可以是匿名类型?,c#,.net-4.0,c#-4.0,C#,.net 4.0,C# 4.0,例如: 注意:上面的内容既不能编译也不能工作(这里不能使用var),它只是为了说明我的观点 更新:为了澄清这个问题,我已经尝试使用 public class MyClass { private static var MyProp = new {item1 = "a", item2 = "b"}; } 这是可行的,但由于动态键入,它不会生成intellisense。我知道匿名类型只是一个编译器技巧,所以我希望我可以利用这个技巧来声明一个结构化字段,而不必事先声明一个类(主要是因为这类字段
public class MyClass {
private static var MyProp = new {item1 = "a", item2 = "b"};
}
这是可行的,但由于动态键入,它不会生成intellisense。我知道匿名类型只是一个编译器技巧,所以我希望我可以利用这个技巧来声明一个结构化字段,而不必事先声明一个类(主要是因为这类字段只有一个实例)。我现在知道这是不可能的,但我不知道为什么会这样。如果编译器只是为匿名对象生成隐式类型,那么让编译器为字段生成此隐式类型应该相当简单。听起来您可能会问一两个问题,所以我将尝试同时解决这两个问题 类字段是否可以强类型化为匿名类型 不可以。匿名类型名称不能在C#代码中声明(因此是匿名的)。静态键入它们的唯一方法是
var
关键字object
private static dynamic MyProp = new {item1 = "a", item2 = "b"};
不,任何成员都应该是强类型的 不过,您可以选择动态类型,以便让您的成员有机会在运行时进行评估
编辑:成员应显式键入 否,匿名类型不能在其声明函数之外作为
对象以外的任何对象公开。虽然匿名类型只是语法上的糖,实际上创建了一个具体类型,但开发人员永远不知道(也不可用)这种类型,因此不能使用。如果是C#4,请查看dynamic关键字
public class MyClass {
private static object MyProp = new {item1 = "a", item2 = "b"};
}
然而,一旦您这样做,您就会丢失任何类型的安全性和方便的编译器检查。改用它如何
公共类MyClass{
私有静态Tuple MyProp=Tuple.Create(“a”、“b”);
}
命名类的属性(或字段)不能有匿名类型,因为这样的类型不能在代码中引用但是,匿名类型可以包含匿名类型的属性:
public class MyClass {
private static Tuple<string, string> MyProp = Tuple.Create("a", "b");
}
但是这种构造在本地范围之外没有实际用途…在C#7中,您最终可以这样做:
var myObj = new
{
Foo = new { Name = "Joe", Age = 20 }
};
呃…所以答案不是“是”,而是“否”?@亚当答案是问题是含糊不清的:)我会尽量让我的答案少一些大豆。。。对象和动态都不提供匿名成员。所以答案应该是否定的;如果将匿名类型分配给对象
,如何将其强制转换为真实类型?@abhishek:对象
当然是一个类型。var是强类型。我想你说的是“显式类型”。@Mark Yes,var不能用作类的成员。MyProp
不是属性,它是字段。@Greg:在这里,我为Diego(和你)修复了它:P@Andrew-我感到很轻松,谢谢你@Greg,我的错,谢谢你的更正你说“永远不知道”和“不能使用”,但你不是在贬低反射和动态
?(请注意,我不是在鼓励这种做法。)@Anthony:不,这两种做法都不允许开发人员(比如编写代码的人)“知道”类型。您当然可以对对象调用GetType()
,但这是一个仅限运行时的操作。dynamic
也不是一个解决方案。我正要自己提供这个精确的代码块。显式静态类型化,并且不必手动构造新类型。我真的希望这比那些愚蠢的“动态”解决方案更具说服力。当然,既然你的答案被截取了,那就不太可能了。呵呵,好吧。不管怎么说,从这个问题上看,元组不一定是一个好的解决方案。示例代码只有字段“item1”和“item2”,但实际代码可能有更多的逻辑名称,使用元组会丢失这些名称。因为这是一个私有字段,所以元组可能是可以的,但是如果这是一个公共字段,我可能会说更好的方法是定义一个特定的类型来存储数据,尽管它需要更多的编码。确切地说,这个方法是有一个静态常量字段,它是结构化的,可以有几个层次的匿名组件嵌套。我就是这么做的,但我失去了对对象属性的智能感知。我想这样做,智能感知可以帮助人们使用我的类。这应该会得到更多的投票
var myObj = new
{
Foo = new { Name = "Joe", Age = 20 }
};
private (string Login, string Password) _credentials = (Login: "123", Password: "123");