- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
背景在attribute specification , 有时有两种有效的方法来编写应用的属性。例如,如果属性类的名称为 HorseAttribute
,您可以将该属性应用为 [HorseAttribute]
或只是 [Horse]
。歧义可以用 @
解决,例如 [@Horse]
。
以下是一个有效的程序:
using System;
using Alpha;
using Beta;
namespace N
{
[Horse]
class C
{
}
}
namespace Alpha
{
// valid non-abstract attribute type with accessible constructor
class HorseAttribute : Attribute
{
}
}
namespace Beta
{
// any non-attribute type with that name
enum Horse
{
}
}
当我只编写 [Horse]
时,C# 编译器能够选择 Alpha.HorseAttribute
。毕竟,Beta.Horse
类型完全不适合在属性规范中使用。
即使我交换了名称,C# 编译器也会知道该怎么做:
using System;
using Alpha;
using Beta;
namespace N
{
[Horse]
class C
{
}
}
namespace Alpha
{
// valid non-abstract attribute type with accessible constructor
class Horse : Attribute
{
}
}
namespace Beta
{
// any non-attribute type with that name
enum HorseAttribute
{
}
}
同样,编译器知道我想要 Alpha.Horse
。
现在是我想问的代码。它与上面的相同,只是这两种类型现在具有相同的名称:
using System;
using Alpha;
using Beta;
namespace N
{
[Horse]
class C
{
}
}
namespace Alpha
{
// valid non-abstract attribute type with accessible constructor
class Horse : Attribute
{
}
}
namespace Beta
{
// any non-attribute type with that name
enum Horse
{
}
}
现在,C# 编译器拒绝构建,说:
error CS0104: 'Horse' is an ambiguous reference between 'Alpha.Horse' and 'Beta.Horse'
我的问题是,为什么编译器在这种情况下不能选择正确的,而它在前面的两个示例中做得很好?
此行为是否符合 C# 语言规范?真的需要C#编译器在这里报错吗?
(当然我知道我可以通过明确地说出 [Alpha.Horse]
来解决它,所以我不是在要求那个“解决方案”。)
最佳答案
我们这里有两个概念混为一谈。
<强>1。编译器如何知道哪个类实现了属性
有一个简单的约定,属性可以通过类名或类名减去属性后缀来引用。因此,当您像这样将 [Horse]
注释添加到 someIdentifier
时,
[Horse]
someIdentifier
[Horse]
的实现必须是继承 Attribute
的类,该类称为 HorseAttribute
或 Horse
.
注意:有一个被广泛接受的约定,即所有实现属性的类都应该在类型名称后加上“Attribute”后缀。
<强>2。编译器如何知道代码引用的是哪种类型
当我们在代码中引用一个类型时,编译器会查找已加载到命名空间中的该类型的定义。如果命名空间中该类型有多个定义,则编译器不会采取任何措施来解决这种歧义,这取决于开发人员改进代码。编译器无法选择,因此引发 error CS1040 .
编译器不会进行任何语义或静态分析来推测编码人员的意图。它很难定义、执行成本高且容易出错。
此错误不会仅在查找属性的实现时抛出。
在您的编译示例中,第 2 点没有歧义,因此代码可以编译。
如果第 1 点的解析导致类型名称不明确,Horse
或 HorseAttribute
,则错误将来自第 2 点。
编译器没有特别允许,例如我正在执行第 2 点以响应第 1 点,所以如果我在这种情况下有歧义,是否有针对第 1 点执行的第 2 点的特殊回退位置?
如果您考虑到特殊规定引入的额外复杂性和时间级别,您可能会接受要求代码作者采取一定程度的严格性会更好。
在我和其他人看来,要求代码避免这种歧义会导致代码更容易被他人和 future 的自己理解。这使得关于为什么的讨论有些没有实际意义,因为我们可以争辩说,编译器团队在这里所做的努力会使代码变得“更臭”,更难维护。
注意:进一步回答
当您考虑 Langauge specification 中的示例所展示的行为时
using System;
[AttributeUsage(AttributeTargets.All)]
public class X: Attribute
{}
[AttributeUsage(AttributeTargets.All)]
public class XAttribute: Attribute
{}
[X] // Error: ambiguity
class Class1 {}
[XAttribute] // Refers to XAttribute
class Class2 {}
[@X] // Refers to X
class Class3 {}
[@XAttribute] // Refers to XAttribute
class Class4 {}
我同意在编译器处理来自一个命名空间的定义和从不同命名空间导入的定义的方式上存在混淆,而且确实存在不一致。
关于c# - 属性规范中奇怪的歧义(两个 using 指令),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57723624/
我们有一个 Java 项目,每天晚上使用 TeamCity 对 Java 类进行静态分析,以查找代码中容易出现的错误。我们想告诉 TeamCity 寻找开发人员可能引入的与 == 与 .equals
前言 🍊缘由 Git分支管理好,走到哪里都是宝 🏀事情起因: 最近翻看博客中小伙伴评论时,发现文章【规范】看看人家Git提交描述,那叫一个规矩一条回复: 本狗亲测在我司中使用规范
使用带有不存在的命名空间的命名空间限定关键字来定义规范是否被认为是不好的做法?我想在公共(public) domain 命名空间中定义实体映射...所以为了避免在合并规范时丢失数据,我使用约定 :en
有没有办法在调用 clojure.spec.test.alpha/check 时覆盖核心谓词函数的生成器? 可以通过 s/gen 中的路径覆盖谓词生成器: (gen/generate (s/gen
以内核 rpm 为例,它允许在一个系统上同时安装多个版本。规范文件中究竟是什么允许的? 我想打包一个已经存在的具有不同安装前缀的多个版本的项目。 最佳答案 百胜 找到了让 yum 安装而不是更新的方法
我正在尝试用 C# 编写 PDF 解析器,但我遇到了一个问题,我不确定如何解释规范。 除非另有说明,否则 PDF 文档中的用户空间为 1/72 英寸(即 1pt)。 Tf 运算符提供的比例将字体从标准
我正在编写一些代码,需要能够获取两个 pdf 并将它们附加到页面级别(例如,如果它们都是 2 页文档,则有一个 4 页文档,其中所有 4 页都与原始文档相同). 在不使用库的情况下,最好的方法是什么?
是否有序言语言语法,或接近它的通常用作引用的东西?我正在使用 SWI-prolog,所以有一个适合这种风格的会很好,否则一般的 prolog 语言语法/规范也能工作。 最佳答案 自 1995 年起,P
我需要一个函数来过滤参数和构建查询。我有 4 个参数,因此如果我尝试为每个条件实现查询,我将不得不写 16 (2^4)实现 - 这不是一个好主意。 我尝试使用界面改进我的代码 Specificatio
这个 ExtGState 对象对图像做了什么: > 我有 PDF 规范,但一点也不清楚。显然,这将身份函数(什么的身份?单位矩阵?)从 [0.0 1.0] 映射到 [0.0 1.0](相同),这是没有
只是想获得有关 ePub 规范的一些帮助。toc.ncx 是否必须具有 src(即 xhtml)。我观察到 .opf 文件中也提供了相同的内容 src。 最佳答案 是的,这是强制性的,这是一个设计问题
让我们看看莱宁根项目 map 的真实示例 :global-vars : ;; Sets the values of global vars within Clojure. This example
我正在开发一个 LOB 框架,它具有 SL 和 MVC 前端、WCF 后端以及在服务器上运行的几个服务模块。我一直在查看 Spec#,看它是否对我有任何帮助。不可空类型和检查异常本身非常好,但我还没有
Promises/A+规范是最小的规范之一。因此,实现它是理解它的最佳方法。福布斯·林德赛(Forbes Lindesay)的以下回答将引导我们完成实现Promises / A +规范Basic Ja
哪个文档指定了 MySQL definer 格式? 具体来说,definer admin@% 中的 % 是什么意思(以及为什么使用这个符号)? 最佳答案 这里MySQL使用的格式定义在the MySQ
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
在 css 规范中,什么会影响更多的 inline 样式或外部 !important 外部“style.css”: #di{color: green!important;} div 文本颜色是红色还
我正在努力思考 CSS 的一些细节,我从 W3 CSS Visual Formatting Spec 9.2.2 中找到了这部分摘录。特别迟钝: Inline-level boxes that are
这个问题在这里已经有了答案: Are (non-void) self-closing tags valid in HTML5? (8 个答案) 关闭 9 年前。 在 HTML5 中你应该使用 或
以下样式在规范方面有何不同? ul .active { background: #E7F3EF;} ul li.active { background: #E7F3EF;} Item 1
我是一名优秀的程序员,十分优秀!