首页 > 解决方案 > c# - 当签名相同时调用特定方法

问题描述

我不确定如何称呼这种情况,但这里是:

我有 2 种不同类型的方法,但从“外部”来看,它们具有相同的签名。在调用该方法时,我想调用一个特定的方法而不是另一个 - 这就是我所拥有的:

public class SomeClass
{
    public async Task<Response<T>> MyMethod<T>(string name, T myObj)
    {
        // some code here
    }

    public async Task<Response<T>> MyMethod<T>(string name, string myObj)
    {
        // some code here
    }
}

对于编译器,上面的 2 种方法是不同的,并且具有不同的签名。但是打电话的时候:

var myClass = new SomeClass();
myClass.MyMethod("name", "something");

在示例中调用MyMethod时,调用的是MyMethod<T>(string name, T myObj),但我真正想要调用的是第二种方法。有没有办法让它调用一个特定的签名?

编辑:

我发现如果我在其中一个方法中给第二个变量一个不同的名称,然后使用变量名称调用该方法作为调用的一部分,它确实有效,如下例所示:

public class SomeClass
{
    public async Task<Response<T>> MyMethod<T>(string name, T myObj)
    {
        // some code here
    }

    public async Task<Response<T>> MyMethod<T>(string name, string myNewObj)
    {
        // some code here
    }
}
var myClass = new SomeClass();
myClass.MyMethod<AnyOfMyTypes>("name", myNewObj: "something");

虽然这是可行的,但在下面乔恩的回应之后,这似乎是正确的做法吗?至于方法名,我想保持不变,另一种选择是通过添加一些虚拟boolean变量来更改签名。

标签: c#.net

解决方案


编译器当然不能用该调用代码调用第二种方法,因为它不知道要推断什么T。但是,如果您指定类型参数,它确实会调用第二种方法:

myClass.MyMethod<string>("name", "something");

虽然这会起作用,但我强烈建议您尽可能更改设计。重命名其中一种方法。我可以合理地称自己为 C# 专家,但我无法通过检查来预测这是否可行。C# 中的重载解析和类型推断细节非常复杂,期望每个 C# 开发人员都完全了解它们是不合理的。

如果您可以给方法起不同的名称,那么代码代码可能会易于阅读。


推荐阅读