代码之家  ›  专栏  ›  技术社区  ›  Jyunhao Shih

使用相互约束的类型参数调用泛型扩展方法时不能忽略扩展类型参数

  •  2
  • Jyunhao Shih  · 技术社区  · 11 年前
    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 回复  |  直到 11 年前
        1
  •  3
  •   Selman Genç    11 年前

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

    如果在需要两个类型的地方指定一个参数是可能的,那么这将导致歧义。想象一下,如果您有另一个同名的方法,但有一个泛型参数,会发生什么情况。

    推荐文章