首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么C#编译器不允许接口中的私有属性设置器?

这个问题涉及到C#编程语言的特性,以及接口和属性的定义。在C#中,接口是一种定义了一组方法、属性和事件的抽象类型,它不能实例化。接口的目的是为了提供一种抽象的、类型安全的规范,以便实现多态性。

在C#中,属性是一种特殊的方法,它可以被当作字段来使用。属性通常包括一个get访问器和一个set访问器,用于获取和设置属性的值。在接口中,属性通常只包括一个get访问器,因为接口不能实例化,所以不需要set访问器。

在接口中,私有属性的存在是没有意义的,因为私有属性只能在接口的实现类中访问,而不能在接口本身访问。因此,C#编译器不允许在接口中定义私有属性的set访问器。

如果您需要在接口中定义一个属性,可以使用公共get访问器和公共set访问器,或者只使用公共get访问器。这样,接口的实现类就可以根据需要来设置属性的值。

推荐的腾讯云相关产品:

  • 腾讯云云服务器:提供高性能、高可用、可扩展的云计算服务,适用于各种应用场景。
  • 腾讯云数据库:提供各种类型的数据库服务,包括关系型数据库、非关系型数据库等。
  • 腾讯云API网关:提供安全、稳定、高可用的API接入服务,支持API的创建、发布、监控和管理。

产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

荐读|属性与可直接访问数据成员之间应该如何选

作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/11221447.html 为什么应该尽量使用属性 属性一直是C#语言特色,目前属性机制比C#刚引人它时候更为完备...也就是说,我们在用属性来表示比较简单字段时,无需通过大量模板代码来构建这个属性编译器会为我们自动创建私有字段(该字段通常称为后援字段,并实现get,set这两个访问所需简单逻辑)。...getter(获取)与setter(设置)这两个单独方法,这使得我们能够对二者施加不同修饰符,以便分别控制外界对该属性获取权限以及设置权限。...由于C#不允许给索引起名字,因此同一个类型索引必须在参数列表上有所区别,否则就会产生歧义。 另外,索引必须明确实现出来,而不能像简单属性那样由系统默认生成。...其实前者效率虽然不会超过后者,但也未必落后于它。因为JIT编译器会对某些方法调用进行内联处理,其中也包括属性。如果编译器属性进行内联处理的话,那么它效率就会与数据成员相同。

1K30
  • 11-接口

    接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承是接口中方法签名,而非方法实现,通常称为实现接口; 接口仅仅是含有一组虚方法抽象类型,不含有任何实现。...CLR允许接口包含静态方法、静态字段、常量、以及静态构造, 但是CLS兼容接口类型是不允许有任何静态成员,因为一些编程语言不能定义或者访问它们。...C#语言就是如此,C#编译器不允许口中有任何静态成员。 约定接口名称第一个字母是大写I;接口可以多继承,实际上实现了多个接口类型允许我们将它对象看作这个接口中任意一个。...编译器我们哪一个Print实现了哪个接口,C#中通过在方法名前面加上接口名来告诉C#编译器。...接口方法,C#编译器在辨析接口成员实现是,会按照先完全限定接口成员后非完全限定成员顺序进行辨析】。

    55890

    第2章 C#程序设计基础

    如果一定要用C#关键字作为变量名,则应使用“@”作为前缀,但强烈建议不要这样做。关键字是对C#编译器具有特殊意义预定义保留字,如if、for、while等。...(3)var本身不是一个新类型,编译器会根据匿名变量被赋予初值推断出该变量具体数据类型。 6. 叙述C#中隐式转换和显示转换概念和特点。...是系统默认类型转换方式,也是编译器自动支持转换方式,该方式不需要事先加以声明,也不需要编写代码就可实现转换。...定义索引语法格式和定义属性语法格式比较相似。 15. 叙述C#中构造函数功能与特性。 构造函数是创建类对象时自动执行一种特殊方法。...接口中只能定义方法、属性、事件和索引这四种类型成员,但不能在接口中声明字段。并且在接口定义中,只能存在这些成员声明,不能对这些成员进行实现,对这些成员实现需要通过类来完成。

    1.8K40

    Unity3D 入门:让 C# 脚本公开可在 Unity 编辑设置属性

    本文介绍如何创建可在 Unity 编辑设置属性 C# 脚本,并介绍如何在 Unity 编辑设置它们。...简单 C# 脚本 本文例子取自于我另一篇博客: Unity3D 入门:最简单控制视角,以及控制角色前进、转向脚本 - walterlv 1 2 3 4 5 6 7 8 9 10 11 12 13...注意,Inspector 中不会识别属性,更不会识别方法。所以要公开,必须使用“字段”。 在哪里修改值 Unity 编辑会在每次重新激活编辑窗口时候重新加载 Unity 项目。...也就是说,此后无论你如何在脚本中修改公开字段值,运行游戏都不会有变化,因为游戏开始后,就会用你在编辑设置值(虽然不是手工设)覆盖脚本中编写默认值。...有趣名称 按照 Unity C# 脚本编写规范,公开字段也是按 camelCase 命名。当然,你也可以用 PascalCase 命名也不会有什么识别上问题。

    55640

    5-自动属性增强

    我们也知道,C#属性实际上是一个编译器自动生成私有字段、get_xxx和set_xxx、一条元数据组成,比如上面的代码编译后: ?...,第2行分别表示这个自动是编译器自动生成,第3行表示该字段不显示在Debugger窗口中。...name"; 25 } 26 } 这种新语法会在没有set访问时候把隐藏私有字段设置为只读字段(readonly ),只允许在声明时候设置初始值或者在构造里面赋值。...只有Name属性具有set_Name方法,而Age和Note属性则没有set访问,且对应私有字段被设置为"initonly",表示这是一个只读字段。...,均是生成为一个字段、get_xxx和set_xxx方法和对应属性元数据,本质依然是编译器语法简化。

    61070

    UnityUnreal 插件集成iOSAndroid 血泪总结

    Language (IL)代码转换为 C++ 代码编译器技术。...extern "C"还可以确保跨平台兼容性,特别是在涉及不同编译器和链接情况下。在后面部分 UE 中,我们也需要使用到。...Unity iOS 桥代码一般调用不同平台原生代码,我们会用一个 C# 文件来桥,保证调用方不需要考虑平台差异。...,我们需要注意是,最好把 .framework.meta 文件也一起放进去,因为需要设置 AddToEmbeddedBinaries 属性为 true,不然最终把游戏打包成 iOS 应用时候,不会自动嵌入我们...这将创建一个新按钮对象,并将其添加到当前场景中。在“Inspector”窗口中,你可以看到新按钮属性。你可以调整它位置、大小、颜色和文本等。

    2.6K63

    JavaSE学习总结(六)——接口与抽象类

    由于模块依赖于一个固定抽象体,因此它可以是不允许修改;同时,通过从这个抽象体派生,也可扩展此模块行为功能。...} } 有些语言中静态类也不能实例化,如C# 意义:越抽象,越稳定。...三、接口 接口是一组没有实例标准与规范。 没有接口电脑是怎样? ? 3.1、为什么需要接口 继承:描述事物自然属性和行为复用。 接口:描述事物社会属性和行为复用。...5)、当实现一个接口时,需要将被定义方法声明为public类型,否则为默认访问类型,Java编译器不允许这种情况。 6)、如果没有实现接口中所有方法,那么创建仍然是一个接口。...接口中字段是默认为:static final ,通俗说就是常量 四、Final(最终) 4.1、final修饰类   final修饰不允许被继承。

    63570

    C# 学习笔记(11)—— C# 春天

    我们看看 C# 3.0 中对属性语法改进。...),你可以使用自动实现特性来对属性定义进行简化,此时不再需要额外定义一个私有的字段了 class Person { public string Name {get; set; } } 从改写后代码可以看出...之所以可以这样定义,主要是因为编译器在编译时会帮我们创建一个私有字段 隐式类型 C# 是强类型语言,在定义一个变量时,需要声明变量类型。然而类型长度如果过长,就可能会影响代码可读性。...C# 是静态语言,变量类型位置就会出现编译时错误 变量不能初始化为 null,因为 null 可以隐式地转换为任何引用类型或可空类型,编译器将不能推断出该变量到底为什么类型 不能用 var 来声明方法中参数...所以说,C# 3.0 编译器是智能编译器

    17310

    Java及JVM是如何识别重载、重写方法?

    之所以不提倡可变长参数方法重载,是因为Java编译器可能无法决定应该调用哪个目标方法。 这种情况下,编译器会报错,并且提示这方法调用有二义性。...然而,Java编译器直接将我方法调用识别为调用第二个方法,这究竟是为什么呢? Java虚拟机是怎么识别目标方法? 重载与重写 同一类中出现多个: 名字相同 参数类型相同 方法,则无法编译。...对Java中重写而Java虚拟机中非重写情况,编译器会通过生成桥方法[2]实现Java重写语义。 由于对重载方法区分在编译阶段已完成,可认为JVM不存在重载概念。...:调用私有实例方法、构造及使用super关键字调用父类实例方法或构造,和所实现接口默认方法 invokevirtual:用于调用非私有实例方法 invokeinterface:用于调用接口方法...Java重写与Java虚拟机中重写并不一致,但编译器会通过生成桥方法来弥补。

    1.2K51

    面向对象Java实现

    b.什么是封装(封装就是将属性私有化,提供共有的方法访问私有属性) c.如何实现封装 例如: package s2java.sg.ch01; public class AccpTeacher3{...我是"+name+",我今年"+age+"岁"; } } 1-2:构造方法 a.为什么需要构造方法(使用构造方法可以给属性赋值。而且,实例化一个对象实际上就是去调用这个对象构造方法。)...class AccpJavaTeacher2 extends AccpTeacher{ } 此例就表明AccpJavaTeacher2类继承了AccpTeacher类 注意:Java中同C#一样不允许有多重继承...Java接口中定义方法在不同地方被实现,可以具有完全不同行为。) c.为什么需要Java接口(增加代码可维护性和可扩展性,当一个方法不知道如何实现,或者说实现什么样效果时候。...注意点:Java接口不能被实例化、Java接口中声明成员自动设置为public,因此Java接口中不能声明私有的成员、 Javajiek中不能出现方法体实现、实现某个Java接口,就必须实现其中定义所有方法

    59610

    C# 8.0 可空引用类型中各项警告错误含义和示例代码

    本文将介绍 C# 可空引用类型部分警告和错误提示,便于进行个人项目或者团队项目的配置。...C# 8.0 如何在项目中开启可空引用类型支持 - 吕毅 C# 可空引用类型 NullableReferenceTypes 更强制约束:将警告改为错误 WarningsAsErrors - 吕毅 警告和错误...1 2 // 当编译器判定 walterlv 可能为 null 时才会有此警告。 var value = walterlv.ToString(); CS8603 可能 null 引用返回。...value) { } CS8614 接口中定义成员中 null 性与实现中成员 null 型不匹配。 具体来说,你口中允许为 null,但是实现中却不允许为 null。...CS8616 接口中定义成员中 null 性与实现中成员 null 型不匹配。 具体来说,你口中不允许为 null,但是实现中却允许为 null。

    70420

    C#接口知识大全收藏建议收藏

    关闭警告提示方式是在成员定义前加上一个new关键字。但如果没有覆盖父接口中成员,使用new 关键字会导致编译器发出警告。   6、方法名称必须与同一接口中定义所有属性和事件名称不同。...3、显式接口成员执行体和其他成员有着不同访问方式。因为不能在方法调用、属性访问以及索引指示访问中通过全权名访问,显式接口成员执行体在某种意义上是私有的。...被继承接口应该是可以访问得到,比如从private 类型或internal 类型口中继承就是不允许。接口不允许直接或间接地从自身继承。...用 TlbImp 创建 .NET 框架元数据可以通过 /R 编译器选项包括在 C# 内部版本中。...4、类还必须具有为其设置全局唯一标识符 (GUID) Guid 属性

    1.9K20

    接口基础教程之三 定义接口成员

    5、接口成员之间不能相互同名。继承而来成员不用再定义,但接口可以定义与继承而来成员同名成员,这时我们说接口成员覆盖了继承而来成员,这不会导致错误,但编译器会给出一个警告。...关闭警告提示方式是在成员定义前加上一个new关键字。但如果没有覆盖父接口中成员,使用new 关键字会导致编译器发出警告。   6、方法名称必须与同一接口中定义所有属性和事件名称不同。...此外,方法签名必须与同一接口中定义所有其他方法签名不同。   7、属性或事件名称必须与同一接口中定义所有其他成员名称不同。   ...8、一个索引签名必须区别于在同一接口中定义其他所有索引签名。   ...一个接口方法声明不允许指定一个方法主体,而声明通常用一个分号结束。   10、接口属性声明访问符与类属性声明访问符相对应,除了访问符主体通常必须用分号。

    47411

    .NET面试题解析(05)-常量、字段、属性、特性与委托

    属性本质 属性是面向对象编程基本概念,提供了对私有字段访问封装,在C#中以get和set访问方法实现对可读可写属性操作,提供了安全和灵活数据访问封装。...'),设置字段值; 因此可以说属性本质还是方法,使用面向对象思想把字段封装了一下。...在定义属性时,我们可以自定义一个私有字段,也可以使用自动属性“{ get; set; } ”简化语法形式。 使用自动属性时需要注意一点是,私有字段是由编译器自动命名,是不受开发人员控制。...我们一行定义一个委托代码,编译器自动生成了一堆代码: 编译器自动帮我们创建了一个类ShowMessageHandler,继承自System.MulticastDelegate(她又继承自System.Delegate...静态函数实现里不能使用非静态成员,如非静态变量、非静态函数等。 5. 自动属性有什么风险? 因为自动属性私有字段是由编译器命名,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.

    1K20

    苏州同程旅游学长给我全面的面试知识库

    编译器将方法地址存储为入口点,并使用此信息在创建任何对象之前开始执行。Void是类型修饰符,它声明方法或变量不返回任何值。 6、什么是物体? ?...自定义控件是作为编译代码(Dll)生成控件,它们更易于使用,可以添加到工具箱中。开发人员可以将控件拖放到他们Web表单中。在设计时属性即可。...可以使用参数不同数据类型,参数不同顺序和参数数量来重载方法。 38、为什么不能为接口内方法指定可访问性修饰符? 在接口中,我们有没有方法定义虚拟方法。所有方法都将在派生类中被覆盖。...这就是为什么它们都公开原因。 39、我们如何设置要继承类,但又要防止该方法被重写? 将该类声明为公共类,并密封该方法以防止其被覆盖。 40、如果继承接口具有冲突方法名称,该怎么办?...工具取决于您自己,因为方法位于您自己类中。当来自不同接口方法期望不同数据时可能会出现问题,但就编译器而言,您可以。 关注苏州程序大白,持续更新技术分享。谢谢大家支持

    3K20

    .NET中那些所谓新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性、隐式类型、自动初始化等所谓新语法,这一篇我们继续征程,看看匿名类、匿名方法以及常用扩展方法。虽然,都是很常见东西,但是未必我们都明白其中蕴含奥妙。...通过Reflector,可以发现,编译器确实重新生成了一个泛型类: 二、匿名方法:[ C# 2.0/.NET image.png 2.0 新增特性 ] 2.1 从委托声明说起   C#匿名方法是在...①我们可以看到,在编译生成类中,除了我们自己定义方法外,还多了两个莫名其妙成员: ?   ②经过一一查看,原来编译器帮我们生成了一个私有的委托对象以及一个私有的静态方法。...(3)由上面的分析,我们可以做出结论:编译器对于匿名方法帮我们做了两件事,一是生成了一个私有静态委托对象和一个私有静态方法;二是将生成方法地址存入了委托,在运行时调用委托对象Invoke方法执行该委托对象所持有的方法...②刚刚在Main函数中看到了匿名方法,现在可以看看编译器为我们所生成命名方法。

    83430

    .NET面试题解析(05)-常量、字段、属性、特性与委托

    属性是面向对象编程基本概念,提供了对私有字段访问封装,在C#中以get和set访问方法实现对可读可写属性操作,提供了安全和灵活数据访问封装。...'),设置字段值; 因此可以说属性本质还是方法,使用面向对象思想把字段封装了一下。...在定义属性时,我们可以自定义一个私有字段,也可以使用自动属性“{ get; set; } ”简化语法形式。 使用自动属性时需要注意一点是,私有字段是由编译器自动命名,是不受开发人员控制。...我们一行定义一个委托代码,编译器自动生成了一堆代码: 编译器自动帮我们创建了一个类ShowMessageHandler,继承自System.MulticastDelegate(她又继承自System.Delegate...静态函数实现里不能使用非静态成员,如非静态变量、非静态函数等。 5. 自动属性有什么风险? 因为自动属性私有字段是由编译器命名,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.

    83510

    Java面试题1:Java基础篇

    这里需要注意以下几点: (1)重写和重载区别: (2)⼦类拥有⽗类对象所有的属性和⽅法(包括私有属性私有⽅法),但是⽗类中私有属性和⽅法⼦类是⽆法 访问,只是拥有。...答: ⽗类私有属性和构造⽅法并不能被继承,所以 Constructor 也就不能被Override(重写),但是可以 Overload(重载),所以你可以看到⼀个类中有多个构造函数情况。...对于 short s1 = 1; s1 += 1; 来说,+= 是 Java 语⾔规定运算符,Java 编译器会对它进⾏特殊处理,因此可以正确 编译。...—————————————————————————————————————————— 17、为什么重写 equals() 就⼀定要重写 hashCode() ⽅法?...序列化实现:将需要被序列化类实现 Serializable ⼝,该⼝没有需要实现⽅法,只是⽤于标注该对象是 可被序列化,然后使⽤⼀个输出流(如:FileOutputStream)来构造⼀个

    31510

    C# 9.0 新特性预览 - init-only 属性

    ] 只初始化 setter (Init Only Setters) 这个特性允许创建只初始化(init only)属性和索引,使得 C#不可变模型更加灵活。...背景 在此之前,我们创建实体类/POCO类/DTO类等等模型类时候,都期望属性只读不允许从外部修改,会将属性 setter 设为私有或者干脆不设置 setter,例如: public class Person...这样我们就可以去掉一堆属性构造方法转而使用对象初始化了,并且达到了不可变目的。...哪些情况下可以被设置 通过对象初始化 通过 with 表达式 在自身或者派生类构造方法中 在标记为 init 属性中 在特性(attribute)类命名参数属性中 以上场景不难理解,但是值得一提是...lambda 或本地函数中,也不允许设置,例如: 原因也很简单,lambda 或本地函数在编译后已经不在构造函数中了。

    55310
    领券