【发布时间】:2017-11-15 08:29:34
【问题描述】:
我有两个不同的命名空间,每个都有一个 Thing 类:
namespace First.Second.Third
{
public class Thing { }
}
namespace Fourth.Fifth.Sixth
{
public class Thing { }
}
现在我尝试在其他地方使用Thing,当然编译器会因为对该类的模糊引用而抱怨:
namespace ConsoleApp1
{
using First.Second.Third;
using Fourth.Fifth.Sixth;
internal static class MainEntryPoint
{
internal static void Main(string[] args)
{
var x = new Thing(); // Complaint.
}
}
}
如果我在using 指令中为其中一个命名空间添加别名,编译器错误就会消失:
using MyAlias = First.Second.Third;
using Fourth.Fifth.Sixth;
现在编译器认为我指的是Fourth.Fifth.Sixth.Thing,而我执行var x = new Thing();。
为什么编译器只是通过向其中一个命名空间添加别名来解决歧义?为什么它会自动选择我没有别名的命名空间?
我希望这会在 SO 和其他地方得到很好的记录和覆盖,但我找不到答案。如果有骗子,谁能帮我找出来?
编辑:我和我猜的每个人都不在同一个页面上。这是一个可能有帮助的真实示例:
如果我有两个叫“Bob”的人,我只是说“这里,把这个给 Bob”,你就不知道该给谁了。如果我说,一个是“Bob Smith”,另一个是“Bob Johnson”,当然我现在可以说“这里,把这个给 Bob Smith”。现在,如果我说,“让我们用一个新名字来称呼 Bob Smith:Bob Brady”。如果我然后说“这里,把这个给“鲍勃”,那仍然是模棱两可的。明白我的意思了吗?
【问题讨论】:
-
因为编译器不知道你想使用哪一个?
-
要引用 First.Second.Third,您必须将其显式实例化为 x.Thing,因此由于别名没有歧义(您没有直接使用命名空间)。
-
您需要
x.Thing才能从First.Second.Third和Thing获取东西,而没有x指的是Fourth.Fifth.Sixth.Thing。它们每个都有一个唯一的名称,因此没有歧义。 -
您想将其创建为
Thing,编译器不知道您的意思。别名解决了这个问题。如果你这样做了new First.Second.Third.Thing,它一开始就不会抱怨。它不再模棱两可,因为您“承诺”编译器将始终将First.Second.Third.Thing称为MyAlias.Thing -
@rory.ap 但是,您在现实世界中的示例并不完全相同。更贴切的描述方式是“如果我不给你某人的姓氏,假设它是‘Johnson’,如果我使用姓氏‘Brady’,我的意思是‘Smith’,现在给我‘Bob’ ”。由于您没有指定姓氏,编译器假定它是“Johnson”并给您“Bob Johnson”,没有歧义。如果您不使用别名,那就像是在说“假设如果我不提供姓氏,它要么是‘约翰逊’,要么是‘史密斯’”。
标签: c# namespaces alias ambiguous using-directives