C# 泛型的隐式类型发现
我想知道C是否支持类泛型的隐式类型发现 例如,这样的函数存在于方法泛型上 我可以采用以下方法:C# 泛型的隐式类型发现,c#,.net,generics,types,C#,.net,Generics,Types,我想知道C是否支持类泛型的隐式类型发现 例如,这样的函数存在于方法泛型上 我可以采用以下方法: public void Foo<T>(T obj); 如您所见,我没有指定通用约束。它被隐式发现,因为我传递了一个int值 我想在类定义级别实现类似的功能: internal interface IPersistenceStrategy<E, T> : IDisposable where E : UniqueEntity<T> 为什么这个功能不起作用?C
public void Foo<T>(T obj);
如您所见,我没有指定
通用约束。它被隐式发现,因为我传递了一个int
值
我想在类定义级别实现类似的功能:
internal interface IPersistenceStrategy<E, T> : IDisposable
where E : UniqueEntity<T>
为什么这个功能不起作用?C#编译器是否不够聪明,无法自动发现我的类型参数
是否有某种方法可以完成我正在寻找的任务?初始化时泛型类型声明中没有类型推断。在调用泛型方法时,只能忽略泛型参数,但初始化泛型类型时不能忽略泛型参数,例如:
var list = new List { 2, 3, 4 };
在这里,您可能希望编译器看到您想要创建一个int列表,所以不需要指定类型参数。但事实并非如此
在您的特定示例中,假设编译器推断出:
IPersistenceStrategy<MyEntity> myStrategy;
ipersistencestrategymystrategy;
如IPersistenceStrategy
所示,如果同一程序集中存在另一个声明,如:
interface IPersistenceStrategy<T> { }
接口IPersistenceStrategy{}
当然,这会引起歧义。因此,这可能是它不被允许的原因之一。C#对方法有类型推断,但对构造函数没有。这项功能原本被建议在C#6版本中,但根据Mads Torgersen()的说法,似乎已经从发行版中删除了
还有一点要注意,就是没有提到它不,你不能这样做。仅仅因为它不在规范中。错误地引用Eric Lippert的话“问为什么一个功能不存在通常会得到答案“因为没有人实现它”。(他说了一些类似的话)。通常它没有实现,因为无论出于何种原因,它被认为不值得付出所需的努力。您的两个示例实际上根本不一样-部分问题在于泛型类型推理只适用于泛型方法,而不适用于泛型类型。。。但第二部分是,我认为您希望指定一些类型参数,而不是其他类型参数,这不是第一种情况下所做的。(注意,
int
不是一个约束,它是一个类型参数……这里的术语值得注意,因为泛型类型参数约束确实存在……)我理解,真的。但这听起来很刺耳。我拒绝相信我不能做到这一点。我认为IPersistenceStrategy
是一个非常丑陋的界面,而IPersistenceStrategy
则是一个简单明了的界面。
IPersistenceStrategy<MyEntity> myStrategy;
interface IPersistenceStrategy<T> { }