Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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#4.0中,类属性/字段是否可以是匿名类型?_C#_.net 4.0_C# 4.0 - Fatal编程技术网

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

在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。我知道匿名类型只是一个编译器技巧,所以我希望我可以利用这个技巧来声明一个结构化字段,而不必事先声明一个类(主要是因为这类字段

例如:

注意:上面的内容既不能编译也不能工作(这里不能使用var),它只是为了说明我的观点

更新:为了澄清这个问题,我已经尝试使用

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");