【问题标题】:Why C# anonymous type can't be used when declaring constants?为什么声明常量时不能使用C#匿名类型?
【发布时间】:2015-07-11 16:32:46
【问题描述】:
private const object foo = new {Prop1 = 10, Prop2 = 20};

此代码将输出错误 CS0836:Anonymous types cannot be used in this expression。但是如果你删除const 它将运行正常。

我真的只是想理解。为什么常量声明中不能使用匿名类型?

更具体地说:应该使用什么其他方式来声明这样的常量?

【问题讨论】:

    标签: c# error-handling constants


    【解决方案1】:

    来自MSDN

    常量可以是数字、布尔值、字符串或空引用

    所以这里有一个匿名类型的事实是不相关的:如果你使用自定义类,你会得到一个类似的错误。

    考虑在这些情况下使用static readonly 字段而不是const

    也就是说,在这种情况下拥有object 类型的字段是有问题的:没有人引用该字段将能够访问Prop1Prop2,因此该字段可以说是无用的。

    考虑定义一个包含您的两个属性的自定义 class(不是匿名类型),并使用它来代替,例如private static readonly Foo foo = new Foo(10, 20);

    【讨论】:

    • 你可以通过反射访问属性,所以它可能没有你说的那么无用。
    • 这是真的,因此我说“可以说”。但是,使用匿名类型 + 反射而不是仅仅使用自定义类型会被认为是不好的做法。
    • 是的,这看起来确实像代码味道。我可以想到一个可接受的用例:将此对象传递给诸如InputExtensions.TextBox之类的方法,该方法接受object参数,然后将其属性转换为HTML属性。
    • 这很公平!虽然我可能希望看到匿名类型在视图中声明为内联,而不是在某些模型中作为 const。
    【解决方案2】:

    据我所知,在 c# 中,您只能将一组预定义的原始类型声明为常量:您可以在此处找到更多详细信息:https://msdn.microsoft.com/en-us/library/ms173119.aspx。匿名类型只是由编译器自动编写的不可变引用类型,因此它就像您可以随时编写的普通引用类型一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 2012-05-07
      • 1970-01-01
      • 2018-10-16
      • 2019-11-04
      • 1970-01-01
      • 2014-08-26
      • 2011-07-07
      相关资源
      最近更新 更多