为什么C#和Razor之间命名空间/导入的机制不同?

4

我和同事在使用Razor和导入命名空间时发现了一些奇怪的问题。

这是我们的测试类,我们将尝试从C#文件和Razor视图中访问它。

namespace test
{
    public class c1 {}
}

namespace test.sub
{
    public class c2 {}
}

这是我们的C#代码示例。

using test;

namespace test
{
    public class testbed
    {
        testbed()
        {
            c1 o1 = new c1();                   //works
            test.sub.c2 o2 = new test.sub.c2(); //works
            sub.c2 o3 = new sub.c2();           //works
        }
    }
}

这是我们Razor代码的示例。"sub"命名空间不可访问。
@using test
@(new c1())          @* Works *@
@(new test.sub.c2()) @* Works *@
@(new sub.c2())      @* Cannot be seen *@

有人能解释一下为什么这在我们的类文件中可行,但在我们的视图中却不行吗?
1个回答

5

sub.c2 在你的代码中有效是因为你在命名空间 "test" 中。将命名空间更改为 "titi",你会发现它不起作用了。

namespace titi
{
    using test;

    public class testbed
    {
        testbed()
        {
            c1 o1 = new c1();                   //works
            test.sub.c2 o2 = new test.sub.c2(); //works
            sub.c2 o3 = new sub.c2();           //don't work
        }
    }
}

namespace test
{
    using test;

    public class testbed
    {
        testbed()
        {
            c1 o1 = new c1();                   //works
            test.sub.c2 o2 = new test.sub.c2(); //works
            sub.c2 o3 = new sub.c2();           //works because your are in namespace *test*
        }
    }
}

你的剃须刀代码在另一个命名空间中(例如,与test不同),因此sub.c2无法工作。


我们的重点是尝试理解为什么剃刀部分不起作用。我们使用的C#代码完全按预期工作。如果需要,我可以尝试澄清我的问题。 - Jessy
Razor代码未在命名空间中定义。它导入了test命名空间,但与您的C#代码不同的关键是namespace关键字。 - vgru
@meziantou 我们已经测试了您的代码,但它并没有解决我们所看到的问题。在您的示例中缺少的是 using test; 的使用语句,这将使 c1 o1 = new c1() 成立。我认为我的解释或问题中缺少了某些东西,这使得您的工作没有集中在我们的问题上,对此感到抱歉。因此,如果您添加使用语句,您会发现唯一无法工作的是 sub.c2 o3 = new sub.c2(); - Jessy
我明白为什么它在 Razor 中无法工作,谢谢!但如果我们包含一个 using 语句,为什么我们就不能访问其中“sub”部分呢?sub.c2 o3 = new sub.c2(); 这是设计意图吗?示例代码 - Jessy
1
一个using-namespace-directive导入给定命名空间中包含的类型,但特别不导入嵌套的命名空间。 - meziantou
感谢@meziantou的耐心和解答。 - Jessy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接