泛型的隐式类型发现

时间:2014-11-21 11:46:40

标签: c# .net generics types

我想知道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#编译器不够智能,无法自动发现我的类型参数吗?

有没有办法完成我要找的东西?

2 个答案:

答案 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,即没有提及它