我想知道C#是否支持类泛型的隐式类型发现。
例如,这种功能存在于方法泛型中。
我可以使用以下方法:
public void Foo<T>(T obj);
并称之为:
int n = 0;
instance.Foo(n);
如您所见,我没有指定<int>
通用约束。它是隐式发现的,因为我传递了int
值。
我想在类定义级别上完成类似的事情:
internal interface IPersistenceStrategy<E, T> : IDisposable
where E : UniqueEntity<T>
我希望将其定义为IPersistenceStrategy<MyEntity>
,其中MyEntity is an UniqueEntity<int>
。
如您所见,T
类型参数是从MyEntity
隐式发现的。
然而,这不起作用。我必须明确提供T
参数:
IPersistenceStrategy<MyEntity, int> myStrategy;
为什么此功能不起作用? C#编译器不够智能,无法自动发现我的类型参数吗?
有没有办法完成我要找的东西?
答案 0 :(得分:0)
初始化时泛型类型声明中没有类型推断。您只能在调用泛型方法时省略泛型参数,但初始化泛型类型不是这种情况,例如:
var list = new List { 2, 3, 4 };
在这里你可能希望编译器看到你想要创建一个int列表,所以不需要指定类型参数。但事实并非如此。
在您的具体示例中,让我们假设编译器推断出这一点:
IPersistenceStrategy<MyEntity> myStrategy;
作为IPersistenceStrategy<MyEntity,int>
然后如果在同一个程序集中有另一个声明,例如:
interface IPersistenceStrategy<T> { }
当然,这会引起歧义。所以这可能是不被允许的原因之一。
答案 1 :(得分:0)
C#具有方法的类型推断,但不适用于构造函数。这个功能被提议使用C#6版本,但根据Mads Torgersen(http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6.aspx)似乎已从发布中删除。
另请查看Languages features in C# 6 and VB 14,即没有提及它