0

我有两个非常相似的通用方法。这个想法是可以使用显式返回类型调用一个,而另一个推断返回类型与obj提供的相同。

第一种方法将被称为:RestResponse response = myCat.Put<RestResponse>()

//Perform a PUT on the current resource, returning the server response deserialized to a new object of the specified type.</summary>
//<typeparam name="T">The expected type of the resource post response. Use 'IRestResponse' to skip deserializing the request.</typeparam>
public static T Put<T>(this APIResource obj, List<Parameter> parameters = null)
{
    if (parameters == null) parameters = new List<Parameter>();
    parameters.Add(new Parameter() { Value = obj, Type = ParameterType.RequestBody });
    return RequestHelper<T>(obj.collection_name + "/" + obj.id, Method.PUT, parameters);
}

自动的就是这样称呼的Cat response = myCat.Put();

//<typeparam name="O">(Automatically Inferred) The type of the current resource, which is also the expected type of the resource request response.</typeparam>
public static O Put<O>(this O obj, List<Parameter> parameters = null) 
     where O : APIResource 
{ return obj.Put<O>(parameters); } //I want to call the first method here.

现在我可以看到这些定义在相互尊重的情况下是如何模棱两可的。奇怪的是没有编译错误,但是在运行时,我得到了堆栈溢出,因为第二种方法只是调用自己。

有没有办法让第二种方法调用第一种方法而不更改任何一种方法的名称?

4

2 回答 2

2

在决定两种方法的“更好”时(这是在方法调用匹配多个签名时执行的操作)时,首选定义为“更接近”调用点的方法。

两个比较常见的例子:

  1. 如果在同一类型中定义了一种方法而另一种未定义,则该类型中的方法获胜。

  2. 如果一种方法在同一个命名空间中而另一种方法不在,那么在同一个命名空间中的方法获胜。

解决歧义的一种方法是不利用它是一种扩展方法这一事实;就好像它不是一样调用它(尽管它仍然可以是一个扩展方法,供外部调用者使用)。

public static O Put<O>(this O obj, List<Parameter> parameters = null) 
     where O : APIResource 
{ return OtherPutClass.Put<O>(obj, parameters); }
于 2013-10-23T17:53:45.290 回答
-1

您是否尝试过显式转换为正确的类型?

似乎是这样的:

public static O Put<out O>( this O obj , List<Parameter> parameters = null ) where O:APIResource
{
  return ((APIResource)obj).Put<O>(parameters) ;  //I want to call the first method here.
}

或者

public static O Put<out O>( this O obj , List<Parameter> parameters = null ) where O:APIResource
{
  return .Put<O>( (APIResource)obj , parameters) ;  //I want to call the first method here.
}

我们得到你想要的。

但是,类型系统与您的意图混淆的事实可能表明有人试图修复错误的线路也会感到困惑。

于 2013-10-23T18:02:24.543 回答