草庐IT

泛型约束

全部标签

c# - 简化泛型类型推断

我正在编写一个通用代码,用于处理从多个来源加载数据的情况。我有一个具有以下签名的方法:publicstaticTResultLoadFromAnySource(thisTSectionsection,stringserviceBaseUri,stringnodeName)whereTSection:ConfigurationSectionwhereTResult:IDatabaseConfigurable,new()whereTContract:new()但这有点矫枉过正:当我通过TResult时,我已经知道什么了TContract和TSection确实是。在我的示例中:publici

c# - 冗余的通用约束?

考虑以下泛型方法:publicT2Frob(T1item)whereT1:class,T2=>itemasT2;编译器将拒绝编译这段代码;类型参数“T2”不能与“as”运算符一起使用,因为它既没有类类型约束也没有“类”约束好的,这很容易解决:publicT2Frob(T1item)whereT1:class,T2whereT2:class=>itemasT2;但这不是多余的吗?考虑到T1已经存在的约束,是否有任何可能不是class的T2?我的问题不是为什么这个“推断”没有在编译器中实现,原因可能只是“没有人想到它”,没关系。我更想知道我的推理是否正确,因为T2是有效的并且在所有情况下在

c# - 对于 C# 无法使用类型约束推断泛型类型参数,是否有解决方法?

EricLippert在他的博文中解释了http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx为什么类型推断不考虑约束,这是有道理的,因为不能通过简单地更改类型约束来重载方法。但是,我想找到一种使用两种泛型类型实例化对象的方法,一种可以推断,另一种可以在考虑约束的情况下推断,而无需指定任何类型。给定类型:publicinterfaceI{OtherCreateOther();}publicclassC:I{publicOtherCreate

c# - 具有多重实现的协变接口(interface)的泛型类型推断,如何解决它?

考虑这个什么都不做的愚蠢程序:interfaceI{}classA1:I{}classA2:A1,I{}classB1{}classB2:B1,I{}classC1:I{}classC2:C1,I{}staticclassProgram{staticvoidf(Iobj){}staticvoidMain(){f(newA2());f(newA2());f(newB2());f(newB2());f(newC2());f(newC2());}}这表明A2和C2同时实现I和I,那B2同时实现I和I.但是,将其修改为staticvoidMain(){f(newA2());f(newB2())

c# - C#/.Net 泛型如何知道它们的参数类型?

在C#中,泛型函数或类知道其泛型参数的类型。这意味着动态类型信息,如is或as可用(与Java不可用的情况相反)。我很好奇,编译器如何将这种类型信息提供给泛型方法?对于我可以想象的类,实例可以简单地有一个指向类型的指针,但对于泛型函数我不确定,也许只是一个隐藏的参数?如果泛型被保留到IL级别,我相信它们是,那么我想知道这是如何在该级别完成的。 最佳答案 由于您已经编辑了您的问题以将其从C#编译器扩展到JIT编译器,这里是该过程的概述,采用List作为我们的例子。正如我们所确定的,List只有一种IL表示。类(class)。此表示具有

c# - 如果声明是接口(interface),编译器无法识别泛型中的属性

查看以下演示我的VisualStudio2017编译器问题的内容publicinterfaceIFoo{stringKey{get;set;}}publicclassFoo:IFoo{publicstringKey{get;set;}}classProgram{staticvoidMain(string[]args){PrintFoo(newFoo(){Key="HelloWorld"});Console.ReadLine();}privatestaticvoidPrintFoo(Tfoo)whereT:IFoo{//setbreakpointhereandtrytolookatfoo

C# 获取泛型类的所有运行时构造类的列表

我正在尝试列出由泛型类创建的所有运行时构造类。换句话说,如果我有一个类:publicGenericCls{publicvoidReset(){...}...}我在很多地方都有这样的代码:GenericClsgci=newGenericCls();GenericClsgcs=newGenericCls();GenericClsgcf=newGenericCls();...我能得到这样的东西吗?:Type[]allconstructed=GetAllConstructed(typeof(GenericCls));返回{GenericCls,GenericCls,GenericCls,...

c# - 如何使用反射获取泛型类型的扩展方法

从互联网上的各种来源,我收集了以下功能:publicstaticNullableTryParseNullable(thisNullablet,stringinput)whereT:struct{if(string.IsNullOrEmpty(input))returndefault(T);Nullableresult=newNullable();try{IConvertibleconvertibleString=(IConvertible)input;result=newNullable((T)convertibleString.ToType(typeof(T),CultureInfo

c# - 为什么泛型类型参数和其他成员之间存在名称冲突

有时像这样的东西很有用:classX{...}classY{XX{get{...}set{...}}}因为X描述了类型是什么(作为类名),以及被访问/改变的值(作为属性名)。到目前为止,一切都很好。假设你想做同样的事情,但以一种通用的方式:classZ{TT{get{...}set{...}}}对于这个例子,编译器提示:Thetype'Z'alreadycontainsadefinitionfor'T'.这发生在属性、变量和方法上,我不太明白为什么-编译器肯定知道T是一个类型,因此可以像第一个例子一样计算出来?简短版本:为什么第一个示例有效,但第二个示例无效?编辑:我刚刚发现,如果我“

c# - 使用泛型实现类型安全的枚举模式

如何在泛型类上实现类型安全的枚举模式?让我们假设它是按照这些思路实现的publicclassKnownSetting{publicreadonlystaticKnownSettingName=newKnownSetting("name","DefaultName",t=>t);publicreadonlystaticKnownSettingSize=newKnownSetting("size","25",t=>Converter.ToInt32);publicStringKey{get;set;}publicTDefaultValue{get;set;}publicFuncConver