当类与命名空间共享名称时 C# 错误

发布于 2024-12-20 21:26:59 字数 428 浏览 1 评论 0原文

程序集 1

namespace Foo
{
    public class Foo { }
}

程序集 2

using Foo;

public class Bar 
{ 
    Foo foo = new Foo();
}

我今天发现上面给出了错误Type name Expected but namespace name found

我觉得这很令人惊讶。据我所知,您不能声明名称空间变量或 new() 名称空间。 Foo 是一种类型,它被用在解析器期望找到类型的地方,那么为什么解析器不能正确解析它呢?我忽略了哪些语言功能,这意味着编译器团队无法实现此功能?

Assembly 1

namespace Foo
{
    public class Foo { }
}

Assembly 2

using Foo;

public class Bar 
{ 
    Foo foo = new Foo();
}

I discovered today that the above gives error Type name expected but namespace name found.

I find this surprising. As far as I'm aware, you can't declare a namespace variable, or new() a namespace. Foo is a type, and it's being used where the parser expects to find a type, so why can the parser not resolve it correctly? What language feature am I overlooking which means that the compiler team were unable to implement this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吾家有女初长成 2024-12-27 21:26:59

Eric Lippert 的博客文章(部分 一个; 两个; 三个; )对此提供了很好的见解。从第一部分开始:

这揭示了 C# 中“类型绑定”算法设计的一个有趣点。也就是说,确定像“XY”这样的名称所谈论的类型或名称空间的算法。我们不“走回头路”。我们不会说“好吧,假设 X 就是这个意思。那么Y就没有意义了。让我们回溯一下;假设 X 表示其他事物,哦,是的,那么 Y 就有意义。”我们明确地弄清楚 X 的含义,然后才能弄清楚 Y 的含义。如果 X 不明确,我们不会检查所有可能性以查看其中是否有 Y,我们只是放弃。

这里我们实际上只是得到一个X,但我认为编译器会在检查它是否意味着它是一个命名空间或类型之前尝试弄清楚它是否意味着后面还有其他内容

就我个人而言,我不介意这个限制。这意味着您不鼓励使用命名空间和类(称为同一事物)编写代码 - 从人类的角度来看,这是一个令人困惑的情况,我很高兴它被劝阻。

Eric Lippert's blog posts (parts one; two; three; four) give good insight into this. From part one:

This reveals an interesting point about the design of the “type binding” algorithm in C#. That is, the algorithm which determines what type or namespace a name like “X.Y” is talking about. We do not “backtrack”. We do not say “well, suppose X means this. Then Y would have no meaning. Let’s backtrack; suppose X means this other thing, oh, yes, then Y has a meaning.” We figure out what X unambiguously means, and only then do we figure out what Y means. If X is ambiguous, we don’t check all the possibilities to see if any of them has a Y, we just give up.

Here we've only actually got an X, but I think the compiler tries to work out whether that means it's a namespace or a type before checking whether or not there's anything else after it.

Personally, I don't mind this restriction. It means you're discouraged from writing code with a namespace and class called the same thing - and as that's a confusing situation from a human point of view, I'm happy for it to be discouraged.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文