C#部分类出现错误

22

我正在使用部分类将某些功能分割到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'
    }
}
12个回答

52

和 @Andrey K 的回答相同,但是用简单的术语来表述

将所有部分类的生成操作设置为“编译” ,使用每个文件的“属性”窗口

属性窗口 -> 生成操作属性


11
谢谢你,这让我感到非常烦恼!显然当我添加这个类时,并没有被添加为“.cs”文件,而是一个没有扩展名的文件。我手动添加了“.cs”,但我想这并不足够启示 Visual Studio。无论如何,再次感谢! - emery.noel
2
我也遇到了同样的问题。我尝试了不带扩展名的方式,然后手动添加了扩展名。谢谢。 - cdev
同样的问题出现在 App.xamlApp.xaml.cs 上。我忘记显式添加 C# 文件,因此生成的代码不完整,即使在解决方案资源管理器中也显示了 C# 文件。必须手动编辑 csproj 以正确添加 C# 文件。 - Timo

45

这两个部分类是否在同一个命名空间中?这可能是一个解释。


7

不同的命名空间?


6

一开始,我无法重现您的错误。

当这些部分类单独在命名空间中定义时,private关键字会导致构建失败,出现“在命名空间中定义的元素不能明确声明为private、protected或protected internal”...

如果我将它们保持私有并嵌套在另一个类中,一切都能正常工作。

只有当我在一个文件中将类的一部分嵌套在另一个类中,在另一个文件中不嵌套类,并删除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#语法,没有更多的上下文无法查看。

4

编辑:

解决方案:构建操作 -> 编译,仅此而已。

我会尽量更具体:

我有一个类在3个不同的文件中分别进行了部分定义。某一时刻,一个函数调用(从一个部分调用另一个部分声明的函数)开始显示错误“在当前上下文中不存在”。直到有人帮助我找出,我才发现意外地将其中一个部分的构建操作设置为“嵌入资源”而不是“编译”,这花费了我很长时间。
要切换构建操作,您应该右键单击解决方案资源管理器中的文件,然后选择属性。然后更改构建操作。
这个问题很旧,我的回答并不完全适用于这种情况。但是它可能对另一种与部分类相关的非常罕见的情况有所帮助。如果我的英语不够清晰,请谅解。

1
如果您告诉我们在您本地的SO上确切说了什么,链接到相关问题并翻译它(假设它不是英语),那么这可能是一个很好的答案。 - ankh-morpork

2
我认为问题出在你将类声明为“private”。尝试将修饰符更改为“internal”,这样类的两个“部分”就可以在同一程序集中“看到”彼此。

根据 MSDN 文档,对于部分类来说,只要两个都是 private,那么 private 就可以了。(我之所以知道这一点是因为我也曾有过同样的想法,因为我只见过 public 部分类。所以我查了一下)。http://msdn.microsoft.com/zh-cn/library/wa80x488.aspx - Troy Howard
有点奇怪。在发布这篇文章之前,我在Visual Studio中编写了一个小型控制台应用程序,并粘贴了OP的确切代码,但它无法编译。将修饰符更改为“internal”,则可以成功编译。 - Matt Hamilton
这不会是 MSDN 第一次出错了... ;) 但这可能是一个过于简单的解释。值得深入挖掘以找到最终答案。 - Troy Howard
好的,结果发现私有/受保护的类只有在它们是嵌套类时才起作用。"在命名空间中定义的元素..."错误是由此引起的。这并不能解释 OP 无法访问属性的问题。显然,如果他走到了这一步,那么这些都是嵌套类。 - Troy Howard

2
我得到的错误是:
“在命名空间中定义的元素不能显式声明为private、protected或protected internal。”
我猜这是一个命名空间问题,正如之前所述。

1
好的,结果发现私有/受保护的类只有在它们是嵌套类时才起作用。"在命名空间中定义的元素..."错误是由此引起的。这并不能解释 OP 无法访问属性的问题。显然,如果他走到了这一步,那么这些都是嵌套类。 - Troy Howard

1
所有文件都应该在同一个文件夹中。

这是我问题中唯一的问题!我的文件夹树如下:
  • 扩展
  • 客户端 - 模型
我移动了扩展文件夹,现在我有了
  • 客户端 - 模型 / - 扩展
它们现在处于同一级别,现在可以工作了。
- Andre Fritzsche

0
在文本上下文中,相同的命名空间只是单词大小写不同,这实际上将它们放入不同的编译器命名空间中。

例子

注意溢出O的大小写。

文件1:

namespace StackOverflow {
public partial class MyVM

文件 2:

namespace Stackoverflow {
public partial class MyVM

原来在过去的十年中,我的默认项目名称与原始项目名称有所不同,但只有大小写不同。哎呀。

0
我分析了你的代码。你将partial class声明为嵌套类,这会导致错误显示。为什么呢?因为partial class不能声明为嵌套类,partial关键字被拆分成多个文件,所以每个文件的名称都相同,当你在嵌套类中声明时,它将无法识别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接