使用相互约束的类型参数调用泛型扩展方法时不能省略扩展类型参数
Can't omit the extension type argument when calling generic extension method with mutually constrained type parameters
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);
我试过调换方法声明中类型参数的顺序,没有区别。
如何修改声明才能像我预期的那样简洁地调用?
或者我的期望完全错误,因为在这种情况下不能省略扩展类型参数?
无法推断一个参数的类型并指定另一个 explicitly.You 需要同时指定两者 types.Another 选项是添加类型 S
的参数,然后编译器将推断第二个参数的类型取决于您传递给 method.Then 的内容,您可以在不指定任何类型的情况下调用它。但是如果你不需要这样的参数,指定两种类型是唯一的选择。
如果在需要两种类型的情况下指定一个参数是可能的,这将导致 ambiguity.Imagine如果您有另一个具有一个通用参数的同名方法会发生什么。
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);
我试过调换方法声明中类型参数的顺序,没有区别。
如何修改声明才能像我预期的那样简洁地调用?
或者我的期望完全错误,因为在这种情况下不能省略扩展类型参数?
无法推断一个参数的类型并指定另一个 explicitly.You 需要同时指定两者 types.Another 选项是添加类型 S
的参数,然后编译器将推断第二个参数的类型取决于您传递给 method.Then 的内容,您可以在不指定任何类型的情况下调用它。但是如果你不需要这样的参数,指定两种类型是唯一的选择。
如果在需要两种类型的情况下指定一个参数是可能的,这将导致 ambiguity.Imagine如果您有另一个具有一个通用参数的同名方法会发生什么。