有没有一种方法可以避免在我的扩展方法中传递两个通用参数?

时间:2020-02-18 17:12:19

标签: c# generics generic-constraints

我有一个类型为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>();

有人知道为什么吗?

1 个答案:

答案 0 :(得分:2)

C#编译器无法推断部分通用签名。基本上什么都不是。为什么?

假设您的代码被接受,然后创建一个新方法:

public static void DoRepetitiveStuff<TOtherObject>(this Installer installer)
where TOtherObject : class, IOtherConstraint, new()
{
   installer.DoOtherStuff();
   installer.DoSomeStuff<TOtherObject>(c => { });
}

现在,您的代码调用哪个方法?你的还是这个?我们不知道,因为它含糊不清。

为避免这种情况,编译器可以推断出 full 签名,或者根本不推断出签名。

作为替代方案,您需要引入另一个可以为您做推断的类。但是,此时,仅指定这两种泛型类型实际上更为简洁。