为什么命名空间/导入在c#和Razor之间的工作方式不同?

Jes*_*ier 4 c# asp.net-mvc namespaces razor

同事和我注意到Razor和导入名称空间有些奇怪.

这是我们的测试类,我们将尝试从ac#文件和Razor视图访问.

namespace test
{
    public class c1 {}
}

namespace test.sub
{
    public class c2 {}
}
Run Code Online (Sandbox Code Playgroud)

这是我们的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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我们的Razor代码示例."sub"命名空间不可访问.

@using test
@(new c1())          @* Works *@
@(new test.sub.c2()) @* Works *@
@(new sub.c2())      @* Cannot be seen *@
Run Code Online (Sandbox Code Playgroud)

有没有人解释为什么它在我们的类文件中有效但在我们的视图中没有?

mez*_*tou 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*
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你的剃刀代码在另一个命名空间(例如,不同test),所以sub.c2不起作用.