C# - 为什么这些命名空间会发生冲突?

时间:2014-11-13 17:38:52

标签: c# xamarin xamarin.android

我正在使用Xamarin.Forms开发一个应用程序。我发现我无法得到以下内容进行编译:

namespace Loopback.Sdk.Xamarin.Example.Forms.Android
{
    [Activity (Label = "Loopback.Sdk.Xamarin.Example.Forms.Android.Android", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : AndroidActivity
    {
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            Xamarin.Forms.Forms.Init (this, bundle);

            SetPage (App.GetMainPage ());
        }
    }
}

构建错误是:

Loopback.Sdk.Xamarin.Example.Forms/Android/MainActivity.cs(4,4): Error CS0234: The type or namespace name `Forms' does not exist in the namespace `Loopback.Sdk.Xamarin'. Are you missing an assembly reference? (CS0234) (Loopback.Sdk.Xamarin.Example.Forms.Android)

从命名空间声明中省略Xamarin解决了这个问题,所以我只能假设我遇到了某种命名空间冲突。我的问题是为什么会发生这种情况,因为命名空间似乎甚至没有相同的根?

更新:

我应该强调异常的一部分,以确定错误:

The type or namespace name `Forms' does not exist in the namespace `Loopback.Sdk.Xamarin'.

因此,为了重新解释一下这个问题,为什么Loopback.Sdk.Xamarin被视为Forms的根名称空间,而不仅仅是Xamarin?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

因为您在命名空间中使用 Xamarin

Xamarin 也是 root 命名空间条目,因此无法决定是否使用命名空间层次结构或<强> Xamarin

如果您必须在命名空间中使用 Xamarin ,那么您必须限定对 Xamarin 命名空间的任何引用,并为其提供备用名称引用。

你可以这样做: -

using XamarinForms = global::Xamarin.Forms;

作为一个例子,并使用如下: -

XamarinForms.Forms.Init(this, bundle);

答案 1 :(得分:0)

这就是编译器如何解析命名空间。鉴于存在名称空间Loopback.Sdk.Xamarin.Example.Forms.Android,这意味着该点缀语法中的所有名称空间。这与C#允许您使用部分限定类型名称(即具有部分但不是所有命名空间的类型名称)的事实相结合意味着编译器已与命名空间的Xamarin部分匹配, Xamarin.Forms是当前命名空间的一部分,其中包含Loopback.Sdk.Xamarin。即它假定Xamarin中的Xamarin.Forms实际上是指Loopback.Sdk.Xamarin

为什么要对类型名称Xamarin.Forms.Forms进行完全限定?如果您将using Xamarin.Forms;作为using指令之一,那么您应该只需在代码中编写Forms.Init()即可。

或者,您可以使用类型别名。例如using Forms = Xamarin.Forms.Forms;。这也允许您在代码中编写Forms.Init()