为什么在方法的返回类型上获得此不一致的可访问性错误?

时间:2019-01-07 17:37:01

标签: c#

我正在研究.NET项目。在DAO类中(使用ADO.NET,但这并不重要),我有一个像这样的方法:

public static List<Inoltro> GetListaInoltriUltimiGiorni(int IdUor, string Protocollista, int NumeroGiorni, DBConnection config)
{
    string query = PROT_INOLTRO.INOLTRI_ULTIMI_N_GIORNI_BY_UOR_AND_PROTOCOLLISTA;

    List<Inoltro> result = new List<Inoltro>();

    using (SqlConnection con = ArxeiaConnection.getARXEIAStringConnection(config.Tenant + "_" + config.Database))
    {
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            try
            {
                cmd.Parameters.AddWithValue("@IdUor", IdUor);
                cmd.Parameters.AddWithValue("@Protocollista", Protocollista);
                cmd.Parameters.AddWithValue("@NumeroGiorni", NumeroGiorni);

                con.Open();

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        // Read advances to the next row.
                        while (reader.Read())
                        {
                            .........................................
                            .........................................
                            .........................................
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                con.Close();
                throw ex;
            }
        }
    }

    return result;
}

如您所见,我正在创建并返回此对象:

List<Inoltro> result = new List<Inoltro>();

问题是Visual Studio在此方法签名上给了我以下错误:

  

可访问性不一致:返回类型List<Inoltro>的访问权限比方法MyClass.GetListaInoltriUltimiGiorni(....)

为什么?我想念什么?我该如何解决?

1 个答案:

答案 0 :(得分:3)

您的方法是public,但是Inoltrointernal。您不能使用公开public类型的internal方法。可以使用方法internal或类型public

我们在查看您的代码时,会想到一些事情。

首先,try catch是不必要的,因为如果引发异常,using已经在连接上进行了Close。消除try catch

其次,请不要在throw ex;中说catch,以供将来参考。说throw;重新引发异常。区别是微妙的。 throw;重新引发捕获的确切异常。 throw ex;重新引发异常,但将堆栈跟踪重置为当前跟踪,而不是原始跟踪。

您唯一想做的throw ex;故意要遮盖异常的来源,例如,因为当前代码和代码之间存在信任边界呼叫者。但是,在那种情况下,最好还是抛出一个新的通用异常。

第三,我不明白为什么您需要同时使用whileif来检查集合是否具有行。当然,如果集合为空,则Read将返回false,因此永远不需要if,对吧?

第四,这只是一个风格点;通常我们会格式化

using (SqlConnection con = ArxeiaConnection.getARXEIAStringConnection(config.Tenant + "_" + config.Database))
{
    using (SqlCommand cmd = new SqlCommand(query, con))
    {

using (SqlConnection con = ArxeiaConnection.getARXEIAStringConnection(config.Tenant + "_" + config.Database))
using (SqlCommand cmd = new SqlCommand(query, con))
{

通常有一个using的主体只是另一个using,在这种情况下,不必要的花括号和缩进不会使代码更易于理解。