类属性/字段在C#4.0中可以是匿名类型吗?

问题描述 投票:8回答:7

如:

public class MyClass {

  private static var MyProp = new {item1 = "a", item2 = "b"};

}

注意:上面的代码不能编译也不能工作(不能在其中使用var),这只是为了说明我的观点。

Update:只是为了澄清问题,我已经尝试使用

private static dynamic MyProp = new {item1 = "a", item2 = "b"};

并且此方法有效,但由于动态键入而不会产生智能感知。我知道匿名类型只是一个编译器技巧,所以我希望可以通过声明结构化字段而不必事先声明类来利用该技巧,这对我有好处(主要是因为只会有这种特定类型的一个实例)领域)。我现在可以看到这是不可能的,但是我不确定为什么会这样。如果编译器只是为匿名对象生成隐式类型,则应该相当简单地让编译器为字段生成此隐式类型。

c# .net-4.0 c#-4.0
7个回答
5
投票

不,任何成员都应为强类型。

尽管您可能会使用动态类型,但给您的成员一个在运行时进行评估的机会。

编辑:成员应明确键入。


11
投票

听起来您可能会问一个或两个问题,所以我会尽力解决这两个问题。

是否可以将类字段强类型化为匿名类型

没有匿名类型名称不能在C#代码中声明(因此为匿名)。静态键入它们的唯一方法是

  1. 通用类型推断
  2. var关键字的使用

这些都不适用于类型的字段。

可以使用匿名类型表达式初始化类字段吗?

是。仅需将该字段声明为与匿名类型兼容的类型:例如object

public class MyClass { 
  private static object MyProp = new {item1 = "a", item2 = "b"}; 
} 

2
投票

如果是C#4,请查看dynamic关键字。

public class MyClass 
{ 
  private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 
} 

但是,一旦执行此操作,就会丢失任何类型安全和方便的编译器检查。


2
投票

如何使用Tuple<string, string>代替?

Tuple<string, string>

1
投票

[命名类]的属性(或字段)>不能具有匿名类型,因为这样的类型不能在代码中引用。 但是,匿名类型可以包含匿名类型的属性:public class MyClass { private static Tuple<string, string> MyProp = Tuple.Create("a", "b"); }

但是这种结构在本地范围之外没有实际用途...

0
投票
[不,匿名类型不能在其声明功能之外作为var myObj = new { Foo = new { Name = "Joe", Age = 20 } }; 以外的任何类型公开。尽管匿名类型只是语法糖,并且实际上会创建一个具体类型,但是开发人员从不知道(也不可用)该类型,因此无法使用。

0
投票
在C#7中,您终于可以做到这一点:
© www.soinside.com 2019 - 2024. All rights reserved.