在使用相互约束的类型参数调用通用扩展方法时,不能省略扩展类型参数

时间:2015-03-11 15:19:26

标签: c# extension-methods generic-type-argument

public static class Utility {
  public static void ShadowDeserializeFile<T, S>(this T target, FileInfo file)
  where T : ShadowDeserializable<S> {
    S shadow = SomeHelpingMethod(file);
    target.ShadowDeserialize(shadow);
  }
}
public interface ShadowDeserializable<S> {
  void ShadowDeserialize(S shadow);
}

使用上面的代码我希望我可以这样称呼它:

var something = new SomeType(); //SomeType implements ShadowDeserializable<ShadowType>
something.ShadowDeserializeFile<ShadowType>(aFileInfoObj);

然而,Visual Studio发出错误,说使用泛型方法需要2个类型参数。只有在调用时才会编译:

something.ShadowDeserializeFile<SomeType,ShadowType>(aFileInfoObj);

我尝试在方法声明中切换类型参数的顺序,没有区别。

我应该如何修改声明,以便按照我的预期简洁地调用它?

或者我的期望是完全错误的,因为在这种情况下,扩展类型参数根本无法省略?

1 个答案:

答案 0 :(得分:2)

无法推断一个参数的类型并明确指定另一个参数。您需要指定两种类型。另一种选择是添加类型为S的参数,然后编译器会为您推断出第二个参数的类型根据您传递给方法的内容。然后您可以在不指定任何类型的情况下调用它。但是如果你不需要这样的参数,那么指定两种类型是唯一的选择。

如果指定一个预期两个类型的参数是可能的,那么就会引起歧义。想象一下如果你有另一个同名的方法有一个泛型参数会发生什么。