Eric Lippert 在他的博客文章中解释了http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx为什么没有约束考虑类型推断,这是有道理的,因为不能通过简单地更改类型约束来重载方法。但是,我想找到一种使用两种通用类型实例化对象的方法,一种可以推断,另一种可以在考虑约束时推断,而无需指定任何类型。
给定类型:
public interface I<T>
{
Other<T> CreateOther();
}
public class C : I<string>
{
public Other<string> CreateOther()
{
return new Other<string>();
}
}
public class Other<T>
{
}
和工厂:
public static class Factory1
{
public static Tuple<T, Other<T1>> Create<T, T1>(T o) where T : I<T1>
{
return new Tuple<T, Other<T1>>(o, o.CreateOther());
}
}
以下所需代码将无法编译:
public void WontCompile()
{
C c = new C();
var v = Factory1.Create(c); // won't compile
}
错误消息是“错误 CS0411:无法从用法中推断方法 'yo.Factory1.Create(T)' 的类型参数。尝试显式指定类型参数。”,这与 Eric 在他的博客中所说的一致邮政。
因此,我们可以简单地明确指定泛型类型参数,如错误消息所示:
public void SpecifyAllTypes()
{
C c = new C();
var v = Factory1.Create<C, string>(c); // type is Tuple<C, Other<string>>
}
如果我们不想指定类型参数并且我们不需要保留类型 C,我们可以使用以下工厂:
public static class Factory2
{
public static Tuple<I<T1>, Other<T1>> CreateUntyped<T1>(I<T1> o)
{
return new Tuple<I<T1>, Other<T1>>(o, o.CreateOther());
}
}
现在指定:
public void Untyped()
{
C c = new C();
var v = Factory2.CreateUntyped(c); // type is Tuple<I<string>, Other<string>>
}
但是,我希望在返回的对象中保留类型 C 而不是指定类型。