我正在使用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
?我该如何解决这个问题?
答案 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()
。