【问题标题】:Error with C# Partial classesC# 部分类错误
【发布时间】:2008-10-08 21:16:15
【问题描述】:

我正在使用部分类在 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'
    }
}

【问题讨论】:

    标签: c# partial-classes


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      答案与@Andrey K 相同,但简单来说

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

      【讨论】:

      • 天哪,谢谢你,这让我发疯了!显然,当我添加类时,它并没有作为“.cs”文件添加,只是一个无扩展文件。我手动添加了“.cs”,但我想这对 VS 来说还不够。无论如何,再次感谢!
      • 我也面临同样的问题。我也添加了没有扩展名,并且在手动添加之后。谢谢
      【解决方案3】:

      不同的命名空间?

      【讨论】:

        【解决方案4】:

        起初,我无法重现您的错误。

        当这些部分类在命名空间内单独定义时,private 关键字会导致构建失败,并显示“命名空间中定义的元素不能显式声明为私有、受保护或受保护的内部”...

        如果我将它们保密并将它们嵌套在另一个类中,一切都会正常。

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

        【讨论】:

          【解决方案5】:

          编辑:

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

          我会尝试更具体:

          我在 3 个不同文件中的 3 个部分类之间共享一个类。在某一时刻,一个函数调用(来自另一部分声明的函数的一部分)开始显示错误“当前上下文中不存在”。我花了很长时间才发现某个人 helped 我不小心将文件的构建操作设置为“EmbeddedResourse”而不是“Compile”。

          要切换构建操作,您应该在解决方案资源管理器中右键单击文件,然后选择属性。然后更改构建操作。

          这个问题很老,我的回答在这种情况下并不完全有帮助。但在另一种与部分类相关的非常罕见的情况下,它可能会有所帮助。对不起,如果我的英语不清楚。

          【讨论】:

          • 如果您告诉我们当地 SO 上的确切内容,链接到相关问题并进行翻译(假设不是英文),这可能是一个很好的答案。
          【解决方案6】:

          我认为这是因为您将您的课程声明为“私人”。尝试将修饰符更改为“内部”,以便该类的两个“部分”可以在同一个程序集中“看到”彼此。

          【讨论】:

          • 根据 MSDN 文档,私有对于部分类来说是可以的,只要它们都是私有的。 (我知道这一点的原因是我也有同样的想法,因为我只见过公开的部分课程。所以我查了一下)。 msdn.microsoft.com/en-us/library/wa80x488.aspx
          • 很奇怪。在发布之前,我在 Visual Studio 中打开了一个小控制台应用程序并粘贴到 OP 的确切代码中,它不会编译。将修饰符更改为“内部”,它可以正常编译。
          • Wouldln 不是第一次 MSDN 出错了... ;) 但这可能解释得太简单了。当然值得深入研究以找到明确的答案。
          • 好的,原来私有/受保护的类只有在它们是嵌套类时才有效。 “命名空间中定义的元素......”错误是由于这个原因。这并不能解释 OP 可能不会访问该属性。很明显,如果他做到了那么远,那么这些就是嵌套类。
          【解决方案7】:

          我得到的错误是:

          命名空间中定义的元素不能显式声明为私有、受保护或受保护的内部

          我猜这是前面所说的命名空间问题。

          【讨论】:

          • 好的,原来私有/受保护的类只有在它们是嵌套类时才有效。 “命名空间中定义的元素......”错误是由于这个原因。这并不能解释 OP 可能不会访问该属性。很明显,如果他做到了那么远,那么这些就是嵌套类。
          【解决方案8】:

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

          【讨论】:

          • 这是我唯一的问题!我有一个文件夹树,例如: - Extensions -Client - Model 我移动了 extensions 文件夹,所以我现在有了 - Client -Model/-Extensions 它们现在处于同一级别并且现在正在工作
          【解决方案9】:

          我分析你的代码。您将部分类声明为嵌套类,这是显示错误的原因。为什么 bcz 部分类不会声明为嵌套类 parial 关键字被拆分为多个文件,因此,当您在嵌套类中声明时,每个文件 nae 都是相同的。

          【讨论】:

            【解决方案10】:

            如果您使用分部类来补充运行时文本模板生成的类,则额外帮助可以节省您的时间的一个极端情况。

            问题确实是您的部分类的命名空间与该类的生成部分的命名空间不同。要检查这一点,只需查看生成的代码。

            要解决这个问题,您需要为您的项目编辑.csproj 文件,并在关于该模板的部分中,添加<ClassNamespace> 标签:

            <Content Include="MyTemplate.tt">
              <Generator>TextTemplatingFilePreprocessor</Generator>
              <ClassNamespace>My.Namespace</ClassNamespace>
              <LastGenOutput>MyTemplate.cs</LastGenOutput>
            </Content>
            

            【讨论】:

              【解决方案11】:

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


              示例

              注意overflowO的大小写。

              文件 1:

              namespace StackOverflow {
              public partial class MyVM
              

              文件 2:

              namespace Stackoverflow {
              public partial class MyVM
              

              原来在过去十年的某个地方,我的默认项目名称与我原来的项目名称不同,但只是以防万一。呜呜呜。

              【讨论】:

                【解决方案12】:

                仅供参考(VS 2020)...错误 CS0103 => 所有相同但不同的文件夹。

                但是类应该有相同的命名空间并且也应该在同一个文件夹中!!!

                虽然它们可以在同一个命名空间中定义,但两个文件应该在同一个文件夹中。我知道文件夹结构应该反映命名空间,但是为了清楚生成代码和我添加的代码,我想按文件夹分隔,但它不起作用。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-08-12
                  • 2015-09-04
                  • 2010-11-17
                  相关资源
                  最近更新 更多