我有一个类型为Installer的类,其中TModel具有约束。 我想用类型签名创建一个扩展方法:\
public static void DoRepetitiveStuff<TOtherObject, TModel>(this Installer<TModel> installer)
where TModel : class, IConstraint, new()
where TOtherObject : class, IOtherConstraint, new()
{
installer.DoSomeStuff<TOtherObject>(c => { });
}
目标是最终我可以使用简单的installer.DoRepetitiveStuff<TOtherObject>();
由于某种原因,当我在另一个文件上调用该函数时。它抱怨说没有任何扩展方法可以接受安装程序...我需要将其用于:
installer.DoRepetitiveStuff<TOtherObject, TModel>();
有人知道为什么吗?
答案 0 :(得分:2)
C#编译器无法推断部分通用签名。基本上什么都不是。为什么?
假设您的代码被接受,然后创建一个新方法:
public static void DoRepetitiveStuff<TOtherObject>(this Installer installer)
where TOtherObject : class, IOtherConstraint, new()
{
installer.DoOtherStuff();
installer.DoSomeStuff<TOtherObject>(c => { });
}
现在,您的代码调用哪个方法?你的还是这个?我们不知道,因为它含糊不清。
为避免这种情况,编译器可以推断出 full 签名,或者根本不推断出签名。
作为替代方案,您需要引入另一个可以为您做推断的类。但是,此时,仅指定这两种泛型类型实际上更为简洁。