访问者必须比财产或索引器更具限制性

 violet 发布于 2023-01-19 16:34

我有以下课程:

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'更具限制性

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

任何人都可以向我解释为什么会这样吗?我真的很想学.

2 个回答
  • 这就是问题:

    private OdbcConnection db { get; private set; }
    

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

    private OdbcConnection db { get; set; }
    

    因为这是整体财产的可访问性,所以已经 是二传手private.

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

    internal OdbcConnection db { get; set; }
    

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

    从C#规范的第10.7.2节:

    访问修饰符必须声明的可访问性是严格大于属性或索引本身的声明可访问更多的限制.确切地说:

    如果属性或索引器的声明可访问public时,访问修饰符可以是protected internal,internal,protected,或private.

    如果属性或索引器的声明可访问protected internal时,访问修饰符可以是internal,protectedprivate.

    如果属性或索引器具有声明的internalor的可访问性protected,则accessor-modifier必须是private.

    如果属性或索引器具有声明的可访问性private,则不能使用accessor-modifier.

    (顺便说一句,如果是私密的读取和写入,它很可能是只是为了更好地使用领域,大多数的使用属性的好处是只存在,如果它暴露超过当前的类.如果你保持作为属性,请考虑将其重命名为遵循正常的.NET命名约定.)

    2023-01-19 16:36 回答
  • 好吧,错误告诉所需的所有信息:

    accessibility modifier ... accessor必须比属性更具限制性......

      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
      }
    

    2023-01-19 16:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有