【问题标题】:accessor must be more restrictive than the property or indexer访问器必须比属性或索引器更严格
【发布时间】:2014-04-09 05:17:50
【问题描述】:

我有以下课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;

namespace Framework
{
    public class OracleProvider
    {
        private OdbcConnection db { get; private set; }
        private String dbUsername = Settings.Default.Username;
        private String dbPassword = Settings.Default.Password;

        public OracleProvider()
        {
            connect();
        }

        public void connect()
        { 
            db = new OdbcConnection("Driver={Microsoft ODBC for Oracle};Server=CTIR; UID="+dbUsername+";PWD="+dbPassword+";");    
        }        
    }
}

现在我收到以下错误:

错误 11:“Framework.OracleProvider.db.set”访问器的可访问性修饰符必须比属性或索引器“Framework.OracleProvider.db”更严格

我一直在寻找类似的问题,但还没有真正找到答案。

谁能向我解释为什么会这样?我真的很想学习。

【问题讨论】:

    标签: c# properties


    【解决方案1】:

    这就是问题所在:

    private OdbcConnection db { get; private set; }
    

    假设你真的希望 getter 和 setter 都是私有的,这应该是:

    private OdbcConnection db { get; set; }
    

    setter 已经 private,因为这是整个属性的可访问性。

    或者,如果您希望 getter 是非私有的,而 setter 是私有的,则需要指定其他修饰符,例如

    internal OdbcConnection db { get; set; }
    

    基本上,如果您要在属性的get;set; 部分指定访问修饰符,则它必须比其他情况更具限制性。

    来自 C# 规范的第 10.7.2 节:

    accessor-modifier 必须声明一个比属性或索引器本身声明的可访问性更严格的可访问性。准确地说:

    • 如果属性或索引器声明可访问性为public,则访问器修饰符可以是protected internalinternalprotectedprivate。李>
    • 如果属性或索引器声明的可访问性为 protected internal,则 accessor-modifier 可以是 internalprotectedprivate
    • 如果属性或索引器声明的可访问性为 internalprotected,则 accessor-modifier 必须为 private
    • 如果属性或索引器的可访问性声明为 private,则不能使用 accessor-modifier

    (顺便说一句,如果它对读写都是私有的,那么使用一个字段可能会更好。使用属性的大多数好处只有在它暴露在当前类之外时才会出现。如果你将其保留为属性,考虑重命名它以遵循正常的 .NET 命名约定。)

    【讨论】:

    • 一种常见的模式是使 setter 私有但 getter 公开/受保护以使属性只读,可能值得将其添加到答案中以保持完整性
    • @Charleh:我已经这样做了,举一个内部 getter 的例子。
    • 是的,我的评论花了大约 5 分钟才发布,您已经更新了 :)
    • 我最初是一名 java 开发人员,什么是内部的,它与私有、受保护和公共相比如何?
    • @Ecchi-Alex:不,它internal 限制更少。 “访问仅限于此程序或从此类派生的类”。是联合,不是交集。 (C# 7 中可能会有一个新的修饰符组合用于交叉点。)
    【解决方案2】:

    嗯,错误告诉了所有所需的信息

    可访问性修饰符...访问器必须比属性更具限制性...

      private OdbcConnection db { // <- property as whole is "private"
        get; 
        private set; // <- accessor (set) is explictly declared as "private" 
      }
    

    所以你可以做任何一个

      // property as a whole is "public", but "set" accessor is "private"
      // and so the accessor is more restrictive than the property
      public OdbcConnection db { // <- property as whole is "public"
        get; 
        private set; // <- accessor is "private" (more restrictive than "public")
      }
    

    或者

      private OdbcConnection db { 
        get; 
        set; // <- just don't declare accessor modifier
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2017-05-28
      • 2016-05-09
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多