繁体   English   中英

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

[英]Compile error using C# automatically implemented properties

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

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

公开SqlDateTime DateOfBirth {get; 组; }

每当我尝试访问隐含的基础模块级别变量_DateOfBirth时,都会收到错误消息。

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

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

您无法访问由编译器创建的后备变量-必须使用该属性。 编译器生成的后备字段以一种防止您访问它的方式专门命名(它没有命名为_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。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM