我有两个不同的命名空间,每一个Thing
类:为什么在C#中添加名称空间别名可消除歧义?
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”,你不知道该给谁。如果我说,一个是“鲍勃史密斯”,另一个是“鲍勃约翰逊”,当然我现在可以说“在这里,把这个给鲍勃史密斯。”现在,如果我说,“让我们给鲍勃·史密斯命名一个新名字:鲍勃·布拉迪”。如果我然后说“在这里,给这个”鲍勃“,这仍然是模棱两可的。请参阅我的观点?
因为编译器不知道这本是一个你想使用别名? –
要引用First.Second.Third,您必须将它明确地实例化为x.Thing,所以不会因为别名而产生歧义(您不直接使用名称空间)。 – Gusman
我知道。我不问如何使用它。我在问为什么模棱两可会消失。 –