题
我正在使用部分类来分割两个文件之间的某些功能,但是我收到了一个错误。我做错了什么?
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'
}
}
解决方案
两个部分类是否在同一名称空间中?这可能是一个解释。
其他提示
不同的命名空间?
起初,我无法重现您的错误。
当在命名空间内单独定义这些部分类时,private关键字会导致构建失败并带有<!> quot;命名空间中定义的元素不能显式声明为private,protected或protected internal <!> quot ; ...
如果我将它们保密并将它们嵌套在另一个类中,一切正常。
只有在一个文件中,我将类的一部分嵌套在另一个类中,并且在另一个文件中,我没有嵌套该类,然后删除private关键字时,我才能重现您的错误...如下所示:
的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#语法,并且在没有更多上下文的情况下无法查看。
修改强>
解决方案:构建动作 - <!> gt; Complile,别的什么
我会尝试更具体:
我在3个不同文件中的3个部分类之间共享了一个类。在某一时刻,函数调用(来自其他部分中声明的函数的一个部分)开始显示错误<!>在当前上下文中不存在<!>“。我花了很长时间,直到有人帮助我弄清楚我不小心设置了文件的构建操作part to <!> quot; EmbeddedResourse <!> quot;而不是<!>“;编译<!>”;
要切换构建操作,您应右键单击解决方案资源管理器中的文件,然后选择属性。然后更改构建操作。
这个问题很老了,在这种情况下,我的答案并不完全有用。但它可能有助于另一个非常罕见的与部分类相关的案例。对不起,如果我的英语不清楚。
我认为这是因为你宣布你的班级为<!> quot; private <!> quot;。尝试将修饰符更改为<!> quot; internal <!> quot;这样两个<!>“一半<!>该类可以<!>“;参见<!>”;彼此在同一个集会中。
我得到的错误是:
命名空间中定义的元素不能显式声明为private,protected或protected internal
我猜测它是如前所述的命名空间问题。
所有文件都应位于同一文件夹中。
我分析你的代码。您将部分类声明为嵌套类,这是导致显示错误的原因。为什么bcz partial class不会声明为嵌套类,parial关键字被拆分为多个文件所以,当你在嵌套类中声明它无法识别时,每个文件都是相同的。
如果您使用部分类来补充运行时文本模板生成的类,那么额外帮助可以节省您时间的角落情况。
问题在于,您的部分类'命名空间确实与该类的生成部分的命名空间不同。要检查这一点,只需查看生成的代码。
要解决此问题,您需要编辑项目的.csproj
文件,并在有关该模板的部分中添加<ClassNamespace>
标记:
<Content Include="MyTemplate.tt">
<Generator>TextTemplatingFilePreprocessor</Generator>
<ClassNamespace>My.Namespace</ClassNamespace>
<LastGenOutput>MyTemplate.cs</LastGenOutput>
</Content>