1

次のコードで正常にコンパイルおよび実行される Mono for Android プロジェクトがあります。ただし、作業中の新しいプロジェクトにコピー/貼り付けすると、[appnamespace].Android.Resource.Layout に「SimpleListItem2」の定義が含まれていないことを示すコンパイラ エラーが発生します。

定義した xml リソース レイアウトにアクセスしようとすると、このエラーが発生することが予想されますが、Google が提供するデフォルトのもの、具体的には「SimpleListItem2」にアクセスしようとしています。コンパイラにデフォルトのレイアウトを認識させるために必要なことはありますか? ありがとう!

public override View GetView(int position, View convertView, ViewGroup parent)
{
  View v = convertView;
  if (v == null) {
    LayoutInflater li = (LayoutInflater)this.Context.GetSystemService(Context.LayoutInflaterService);
    v = li.Inflate(Android.Resource.Layout.SimpleListItem2, null);
  }

  TextView tt = (TextView)v.FindViewById(Android.Resource.Id.Text1);
  if (tt != null) { tt.Text = string.Format("{0}, {1}", this.LastName, this.FirstName); }  
  return v;
}

基本的に、Android.Resource.Layout 名前空間の下の Mono.Android アセンブリでこれらのレイアウトへのアクセスを探しています。

ActivityListItem
BrowserLInkContextHeader
ExpandableListContent
PreferenceCategory
SelectDialogItem
SelectDialogMultiChoice
SelectDialogSingleChoice
SimpleDropDownItem1Line
SimpleExpandableListItem1
SimpleExpandableListItem2
SimpleGalleryItem
SimpleListItem1
SimpleListItem2
SimpleListItemChecked
SimpleListItemMultipleChoice
SimpleListItemSingleChoice
SimpleListItemDropDownItem
SimpleSpinnerItem
TestListItem
TwoLineListItem

4

2 に答える 2

9

これは C# 言語の機能であり、C# 言語仕様に従って動作しています。

次の例を検討してください。

using System;

namespace Example {
    namespace System {
    }

    class Bad : System.Object {
    }
}

上記はコンパイルに失敗します:

ns.cs(8,24): error CS0234: The type or namespace name `Object' does not exist in 
the namespace `Example.System'. Are you missing an assembly reference?

これは、.NET CSC と Mono の mcs コンパイラの両方に当てはまります。

なんで?§10.8 C# 言語仕様の名前空間と型名、100 ~ 102 ページを参照してください。

  • それ以外の場合、namespace-or-type-nameはフォームN.IまたはフォームN.I<A1, ..., AK>です。 N最初にnamespace-or-type-nameとして解決されます。

この場合System.Object、フォームの を処理していますN.I。したがって、最初に解決する必要がありますSystem

  • それ以外の場合、namespace-or-type-nameが次の形式Iまたは次の形式の場合I<A1, ..., AK>:
    ...
    • それ以外の場合、名前空間 N ごとに、namespace-or-type-name が発生する名前空間から始まり、各囲み名前空間 (存在する場合) に続き、グローバル名前空間で終了し、エンティティが見つかるまで次の手順が評価されます。 : ...

これにより、トークンSystemが に解決されExample.Systemます。これが解決されると、コンパイラは、つまり の完全修飾名Systemを解決しようとします。このタイプは存在しないため、エラーが発生します。System.ObjectExample.System.Object

上記のサンプルの修正?使用global:::

class Bad : global::System.Object {
}

同じことが Android コードにも当てはまります。たまたま名前空間内にいて 、 型Example.Androidを使用する必要がある場合は、を使用します。Android.Resource.Layoutglobal::Android.Resource.Layout

または、宣言の時点で解決されるusing-alias を使用できます。

using System;
using MyObject = System.Object;

namespace Example {
    namespace System {
    }

    class Bad : MyObject {
    }
}
于 2013-05-30T14:16:16.183 に答える
7

名前空間の衝突がこのエラーを引き起こしているようです。名前空間で「Android」を使用する場合は注意してください。

アプリの名前空間に "Android" が含まれている場合、Xamarin の Mono for Android コンパイラは、Google の SimpleListItem2 オブジェクトの解決に苦労しているようです。

エラーが発生するには、"Android" 文字列が名前空間内の完全な文字列 (部分文字列ではない) である必要があります。名前空間「BenHorgen.Android.MyApps.TestApp」はコンパイラ エラーを引き起こします。

具体的には、文字列「Android」を名前空間の部分文字列として含めても、問題は発生しません。例: "BenHorgen.MyAndroidApps.TestApp" では問題は発生しません。

于 2012-10-13T17:15:22.957 に答える