已经定义了一个与相同参数类型的成员称为 c#。

3

正如标题所说,我遇到了这个错误:already defines a member called with the same parameter types c#

我查看了多个相同的问题,但它们都只是解释了为什么会出现这种情况以及如何处理它(将方法名称更改为其他名称),但是我不想将方法名称更改为其他名称,因为它是具有不同参数的相同方法,所以我只想绕过它。

这是我的两个方法:

public static List<int> Lista(int vrDok)
{
    List<int> list = new List<int>();
    using (FbConnection con = new FbConnection(M.Baza.connectionKomercijalno2018))
    {
        con.Open();
        using (FbCommand cmd = new FbCommand("SELECT BRDOK FROM DOKUMENT WHERE VRDOK = @VrDok ORDER BY DATUM ASC", con))
        {
            cmd.Parameters.AddWithValue("@VrDok", vrDok);

            FbDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                list.Add(Convert.ToInt32(dr[0]));
            }
        }
    }
    return list;
}
public static List<int> Lista(int magacinId)
{
    List<int> list = new List<int>();
    using (FbConnection con = new FbConnection(M.Baza.connectionKomercijalno2018))
    {
        con.Open();
        using (FbCommand cmd = new FbCommand("SELECT BRDOK FROM DOKUMENT WHERE MAGACINID = @MID ORDER BY DATUM ASC", con))
        {
            cmd.Parameters.AddWithValue("@MID", magacinId);

            FbDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                list.Add(Convert.ToInt32(dr[0]));
            }
        }
    }
    return list;
}

如您所见,它们完全相同,但参数不同,这使我遇到了错误。

我该如何绕过它?


10
试着从编译器的角度来看待它。如果我写了Lista(1),编译器怎么知道该调用哪一个?它怎么知道1是magacinId还是vrDoK? - Rup
那么,最聪明的做法是如何区分它们呢? - Aleksa Ristic
4
“ListaByMagacin”和“ListaByVrDok”是一个例子(但我显然混淆了语言)。 - Damien_The_Unbeliever
因此,使用相同的名称并通过变量名称以某种方式进行区分是不明智的。 - Aleksa Ristic
3
这并不是聪明与否的问题,只是不可能使用相同名称和签名声明两种不同的方法,仅因参数名称不同而有所区别。 - René Vogt
显示剩余2条评论
3个回答

6

出现错误是因为方法签名相同
- Lista(int)
- Lista(int)
参数名称不重要。

有多种解决方法:
- 更改一个方法的名称(例如,ListaByVrDok,ListaByMagician)<= 推荐方法
- 将一个方法移动到另一个类中
- 在一个方法中添加一个参数
- 将一个方法中的int更改为double


2
在你的第一部分中值得注意的是,“return List”不相关。你不能仅通过返回类型来区分方法,因此重要的只是Lista(int) - Chris
2
@Chris 如果我没记错的话,在IL级别上是可以的,但在C#级别上,你不能编写或使用这样的方法。 - Marc Gravell
3
"在一个方法中将 int 改为 double" 并不是一个好的做法,很可能是个坏主意。 - Enigmativity
@Enigmativity 是的,但这只是一个想法。 - Davide Pizzolato

5

任何Davide的建议都可以。另一个选项是只有一个方法,它接受ID和参数名称,如下所示:

public static List<int> Lista(int id,string paramName)
{
    List<int> list = new List<int>();
    using (FbConnection con = new FbConnection(M.Baza.connectionKomercijalno2018))
    {
        con.Open();
        using (FbCommand cmd = new FbCommand("SELECT BRDOK FROM DOKUMENT WHERE MAGACINID = @MID ORDER BY DATUM ASC", con))
        {
            cmd.Parameters.AddWithValue(paramName, id);

            FbDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                list.Add(Convert.ToInt32(dr[0]));
            }
        }
    }
    return list;
}

由于这两种方法中的所有内容都相同,只是参数名称有所不同。


1
最好使用“enum”而不是“string”进行介绍。 - Enigmativity
1
@Enigmativity 是的,那是一种选择。我想使用字符串会提供最大的灵活性和较少的更改。 - Hagashen Naidu
正确但升级困难。如果数据库中参数的名称更改,所有出现的情况都必须更改。 - Davide Pizzolato
1
@DavidePizzolato - 是的,这是其中一部分的重点。你应该被迫将数据库和代码视为一个系统,并且你必须在每个系统中管理引用。这比希望某个程序员不会意外地打错字要好。 - Enigmativity
我会使用这种方法,但是用 enum 代替 string - Aleksa Ristic
1
如果您要这样做,您需要更新SQL语句,实际上引用其where子句中的正确参数。将参数本身的实际名称更改并没有太大意义 - 您可以干脆将其称为“@id”或其他通用名称。 - Chris

0

我选择的迁移名称已经被使用了。

add-migration "added-list-to-model-a"

我所需要做的就是更改我的迁移名称。
add-migration "re-added-list-to-model-a"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接