C# 使用C自动实现的属性编译错误

C# 使用C自动实现的属性编译错误,c#,visual-studio-2010,C#,Visual Studio 2010,A C Noob,我正在尝试使用SharpDevelop实用程序将我的VB.NET应用程序转换为C 我注意到我自动实现的属性正在生成许多错误。例如,以以下属性为例: 公共SqlDateTime出生日期{get;set;} 每当我试图访问隐含的底层模块级变量_DateOfBirth时,我都会得到错误 错误699当前上下文D:\Users\Chad\Desktop\BESI CSharp\BESI\BESI.BusinessObjects.ConvertedToC\ChinaVisa.cs 240

A C Noob,我正在尝试使用SharpDevelop实用程序将我的VB.NET应用程序转换为C

我注意到我自动实现的属性正在生成许多错误。例如,以以下属性为例:

公共SqlDateTime出生日期{get;set;}

每当我试图访问隐含的底层模块级变量_DateOfBirth时,我都会得到错误

错误699当前上下文D:\Users\Chad\Desktop\BESI CSharp\BESI\BESI.BusinessObjects.ConvertedToC\ChinaVisa.cs 240 13 BESI.BusinessObjects.Converted中不存在名称“\u DateOfBirth”


我可以将属性声明扩展为完整的属性,但这不是必需的,我想了解为什么会出现此错误。

您无法访问编译器创建的支持变量-您必须使用该属性。编译器生成的BackingField被专门命名,以防止您访问它。它没有命名为DateOfBirth,它的命名类似于k_ubackingfield

直接访问属性-如果需要直接操作支持字段,则不要使用自动实现的属性

只是一个旁注——属性名是什么并不重要,它是一个实现细节,可能会在不同版本的编译器上或在不同的编译器实现中发生变化。该字段被赋予一个标识符,该标识符专门设计用于满足CLR的命名限制,但未通过C的命名限制,因此无法编写直接访问该变量的C代码

还要记住,自动实现的属性不是公共字段。它们是编译器为您展开的一种缩写,有点像宏

所以这个班:

class Bar
{
    public object Foo { get; set; }
}
扩展到以下内容:

class Bar
{
    [CompilerGenerated]
    private object <Foo>k__BackingField;

    public object Foo
    {
        [CompilerGenerated]
        get
        {
            return this.<Foo>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.<Foo>k__BackingField = value;
        }
    }
}

它仍然是一个完整的属性——您只需要允许编译器为您编写getter和setter

如果使用自动生成的属性,则不能依赖编译器为支持字段选择任何特定名称。这完全是特定于编译器的,即使您可以访问这些字段,如果您使用其他编译器,您的代码也可能会中断。

Hmm。您可以在Vb.NET中执行此操作。如果不能在C中执行此操作,隐式属性与公共变量有何不同?@Chad:Properties的访问方式与字段不同,因此如果使用自动属性并决定稍后在访问器中放入更多代码,则不会中断引用代码的程序集。如果将字段更改为属性,那么引用程序集的程序集将在不重新编译的情况下中断。只要计时器允许,我会投票给你正确的答案,但还有一个问题:据我所知,至少在VB.NET中,访问类中的属性与访问公共变量是一样的。他们有什么不同?@Chad-好问题!访问公共字段和公共属性时,两种语言中使用的语法相同,但编译器为这些成员发出的元数据非常不同。这意味着调用您的类的代码可能使用反射来处理您的类,并且由于属性和字段的元数据不同,如果您将成员从字段切换到属性,您将中断此客户端的代码。