質問
一部の機能を2つのファイルに分割するために部分クラスを使用していますが、エラーが発生しています。私は何を間違えていますか?
A1.cs:
private partial class A
{
private string SomeProperty { get { return "SomeGeneratedString"; } }
}
A2.cs:
private partial class A
{
void SomeFunction()
{
//trying to access this.SomeProperty produces the following compiler error, at least with C# 2.0
//error CS0117: 'A' does not contain a definition for 'SomeProperty'
}
}
解決
2つの部分クラスは同じ名前空間にありますか?それが説明かもしれません。
他のヒント
@Andrey Kと同じ答えですが、簡単に言えば
これらの各ファイルの「プロパティ」ウィンドウを使用して、すべての部分クラスのビルドアクションを「コンパイル」に設定します
異なる名前空間?
最初は、エラーを再現できませんでした。
これらの部分クラスが単独で名前空間内で定義されている場合、privateキーワードによりビルドが失敗し、<!> quot;名前空間で定義された要素をprivate、protected、またはprotected internal <!> quotとして明示的に宣言できません; ...
それらをプライベートにして別のクラス内にネストすると、すべて正常に動作します。
エラーを再現できるのは、あるファイルで、クラスの一部が別のクラス内にネストされており、別のファイルでは、クラスをネストせず、プライベートキーワードを削除した場合のみです...
Class1.cs:
namespace stackoverflow.answers
{
public class Foo
{
private partial class Bar
{
private string SomeProperty { get { return "SomeGeneratedString"; } }
}
}
}
Class2.cs:
namespace stackoverflow.answers
{
partial class Bar
{
void SomeFunction()
{
string bar = this.SomeProperty;
}
}
}
名前空間が異なる場合、説明したエラーも表示されます。
提供されたコードは無効なC#構文であり、コンテキストがなければ調査できないため、ソリューションのコード全体を投稿してください。
編集:
solution:ビルドアクション-<!> gt;コンパイル、他には何もありません
より具体的にしようと思います:
3つの異なるファイルの3つの部分クラス間でクラスを共有しました。ある時点で(ある部分から、別の部分で宣言された関数の)関数呼び出しがエラー<!> quot; does not exist in current context <!> quot;を表示し始めました。誰か助けて、誤ってファイルのビルドアクションを設定したことがわかりました<!> quot; EmbeddedResourse <!> quot;の一部<!> quot; Compile <!> quot;の代わりに。
ビルドアクションを切り替えるには、ソリューションエクスプローラーでファイルを右クリックし、プロパティを選択する必要があります。次に、ビルドアクションを変更します。
この質問は古いものであり、私の答えはまさにこの場合には役に立ちません。ただし、部分クラスに関連する他の非常にまれなケースでは役立つ場合があります。英語がわからない場合は申し訳ありません。
クラスを<!> quot; private <!> quot;として宣言しているためだと思います。修飾子を<!> quot; internal <!> quot;に変更してみてください。 2つの<!> quot;半分<!> quot;クラスの<!> quot; see <!> quot;同じアセンブリ内で互いに。
エラーは次のとおりです:
名前空間で定義された要素は、private、protected、またはprotected internalとして明示的に宣言できません
前述の名前空間の問題だと思います。
すべてのファイルは同じフォルダーにある必要があります。
コードを分析します。部分クラスをネストされたクラスとして宣言したため、エラーが表示されます。 bcz部分クラスがネストされたクラスとして宣言されない理由
追加のヘルプで時間を節約できる場合は、部分的なクラスを使用してランタイムテキストテンプレートの生成されたクラスを補完する場合です。
チャンスは、問題は実際にあなたの部分クラスの名前空間がそのクラスの生成された部分の名前空間と異なるということです。それを確認するには、生成されたコードを見てください。
それを修正するには、プロジェクトの.csproj
ファイルを編集し、そのテンプレートに関するセクションに<ClassNamespace>
タグを追加する必要があります:
<Content Include="MyTemplate.tt">
<Generator>TextTemplatingFilePreprocessor</Generator>
<ClassNamespace>My.Namespace</ClassNamespace>
<LastGenOutput>MyTemplate.cs</LastGenOutput>
</Content>