gpt4 book ai didi

c# - 你能用命名空间声明和成员解释这个涉及 C# 'using' 关键字的边缘案例吗?

转载 作者:太空狗 更新时间:2023-10-29 20:55:44 25 4
gpt4 key购买 nike

考虑以下简短的代码片段。

namespace B
{
public class Foo
{
public string Text
{
get { return GetType().FullName; }
}
}
}

namespace A.B
{
public class Foo
{
public string Text
{
get { return GetType().FullName; }
}
}
}

首先熟悉示例 #1

using B;

namespace A.C
{
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}

现在考虑示例#2

namespace A.C
{
using B; // Notice the placement here.

public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}

示例 #1 没有什么特别之处。然而,示例 #2 的事情变得有趣了。您必须密切注意示例中使用的所有标识符。作为一个有趣的练习,尝试在不将其插入编译器的情况下猜测会发生什么。我不会在这里透露答案,因为 1) 自己尝试很容易,并且 2) 我不想破坏乐趣。

请问程序:

  • 不编译
  • 显示B.Foo
  • 显示 A.B.Foo

问题...在 C# 规范中的何处描述了此行为?

我确实看过 C# 4.0 规范中的第 3.7 节,尤其是项目符号 #2,但我认为这并不能解释该行为。如果有的话,它几乎让我觉得编译器的行为与规范相矛盾。

最佳答案

第一个示例打印“B.Foo”,第二个示例打印“A.B.Foo”。这是因为在第二个示例中,using B; 指令包含在 A.C 命名空间中。

为什么它使用A.B而不是B

因为 namespace 查找遵循与类型名称限定查找相同的规则。 Section 3.8 C#规范。

基本上,当编译器处理 using 指令时,会在 A.C 命名空间中查找符号 B。没有找到它,它在 A 命名空间中查找。因为它是作为 A 的子命名空间在那里找到的,所以它选择该命名空间而不是转到全局命名空间来查找 B 命名空间。

编辑:
正如@P.Brian.Mackey 所建议的那样,您可以使用 using global::B; 访问 B 命名空间。

关于c# - 你能用命名空间声明和成员解释这个涉及 C# 'using' 关键字的边缘案例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3158604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com