【问题标题】:Why does namespaces/imports work differently between c# and Razor?为什么命名空间/导入在 c# 和 Razor 之间的工作方式不同?
【发布时间】:2013-12-12 03:10:24
【问题描述】:

我和同事注意到 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 *@

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

【问题讨论】:

    标签: c# asp.net-mvc razor namespaces


    【解决方案1】:

    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# 代码完全按预期工作。如果需要,我可以尝试澄清我的问题。
    • Razor 代码未在命名空间中定义。它导入 test 命名空间,但关键区别在于 C# 代码中的 namespace 关键字。
    • @meziantou 我们已经测试了您的代码,但它并没有解决我们看到的问题。您的示例中缺少的是使用语句using test;,它将生成c1 o1 = new c1()。我认为我在解释或问题中遗漏了一些东西,这使您的工作没有专注于我们的问题,对此感到抱歉。因此,如果您添加 using 语句,您将看到唯一不起作用的是 sub.c2 o3 = new sub.c2();
    • 我了解它在剃须刀内部不起作用的原因,谢谢!。我不明白,如果我们包含一个 using 语句,为什么我们无权访问它的“子”部分。 sub.c2 o3 = new sub.c2(); 这是有意设计的吗? Example Code.
    • 一个 using-namespace-directive 导入给定命名空间中包含的类型,但具体不导入嵌套命名空间。 (msdn.microsoft.com/en-us/library/aa664766(v=vs.71).aspx)
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多