Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型的隐式类型发现_C#_.net_Generics_Types - Fatal编程技术网

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

我想知道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>  { }