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

时间:2010-12-20 13:13:54

标签: c# visual-studio-2010

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

我注意到我自动实现的属性会产生很多错误。例如,请使用以下属性:

public SqlDateTime DateOfBirth {get;组; }

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

错误699当前上下文中不存在名称'_DateOfBirth'D:\ Users \ Chad \ Desktop \ BESI CSharp \ BESI \ BESI.BusinessObjects.ConvertedToC#\ ChinaVisa.cs 240 13 Besi.BusinessObjects.Converted

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

2 个答案:

答案 0 :(得分:9)

您无法访问编译器创建的后备变量 - 您必须使用该属性。编译器生成的支持字段的具体命名方式是阻止您访问它(它不是_DateOfBirth,它的名称类似于<DateOfBirth>k__BackingField)。

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

只是旁注 - 属性名称无关紧要(它是一个实现细节,可能会在不同版本的编译器上或完全不同的编译器实现上发生变化)。该字段被赋予一个标识符,专门设计用于满足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。

答案 1 :(得分:1)

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