【问题标题】:Why is the attribute target 'typevar' undocumented?为什么属性目标“typevar”没有记录?
【发布时间】:2014-01-02 17:18:51
【问题描述】:

众所周知,在 C# 中,可以指定自定义属性规范的 目标,如示例中所示

[method: SomeDecoration]
[return: SomeOtherMark]
int MyMethod();

“目标”method:return: 帮助指定属性属于代码中的哪个元素。

根据 C# 语言规范,存在以下属性目标:

  • 全球的:
    • assembly
    • module
  • 其他:
    • field
    • event
    • method
    • param
    • property
    • return
    • type

其中一些,如field总是是多余的,因为在不指定它们的情况下,总是很清楚属性“所在”的位置。

但是确实存在(至少在我这里有的 Visual C# 的实现和版本中)一个额外的属性目标,即:

  • typevar

例如在代码中是允许的

class MyGenericCollection<[typevar: HereYouSee] TItem>    // legal
{
}

属性目标typevar,就像field 等一样,从来都不是必需的。

我的问题: 有谁知道规范或文档中未提及 typevar: 的历史原因?这在编写 2.0 版 C# 语言规范时是否被遗忘了?或者,如果不是疏忽,为什么要实施?

【问题讨论】:

  • 我的猜测(但这只不过是一个猜测)是它没有被记录,因为它没有用:关于属性的应用不可能有歧义,所以指定 typevar 永远不会改变代码的含义。
  • @ThomasLevesque 我也想过这个问题,但据我所知,type: 和当然property: 在完全相同的意义上也是“无用的”,但它们仍然是 记录在案。
  • 三个人觉得这个贴子太“民意”应该关闭?但是,我尝试中立地询问;我不是在问,“你们认为规范或实现是好是坏”,我是在问,“有没有人真正知道关于 typevar: 的故事”。
  • 不要担心关闭投票...有些人看到有人投票关闭,只是不假思索地做同样的事情。如果问题已关闭,它将立即重新打开。
  • 我不同意某些“目标”无用的说法。如果您想限制自定义属性的使用,并且不希望有人将您的属性放在不受欢迎的地方,它们非常有用。

标签: c# attributes


【解决方案1】:

实际上,typevar 属性目标是有记录的,但似乎只在标准化的 C# 2.0 语言规范中: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf#page=399

C# 3.05.0 语言规范均未提及 typevar。 (我没有找到 C# 4.0 规范。)

所以回答你的第二个问题,不,它并没有在 C# 2.0 中被遗忘,但从那时起它就被遗忘了 :) 我认为这一定是一个疏忽,因为 typevar 属性目标仍然(C# 5.0)有效.

【讨论】:

  • 很好的发现。据我记得,当 .NET 2.0 和 C# 2 来自 Microsoft 时,Word 格式的 C# 语言规范不包含 C# 中的所有内容,而只包含版本 2 中新增或更改的内容。请参阅this file.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2013-04-24
  • 2010-10-09
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多