草庐IT

Generics

全部标签

c# - 在 Visual Studio 中突出显示泛型类型的语法

看看下面的代码:publicclassMyClass{...}在eclipse中使用Java或C++时,T将突出显示,因为它是一个通用模板。如何在VisualStudio中实现此功能? 最佳答案 正如@MichaelSander提到的,UserTypes会提供此功能,但只是以一种不方便和部分的方式。假设此功能对您有用,下面是您如何根据需要为泛型类型着色。“usertypes.dat”文件必须由您创建为基本文本文件,并且必须保存到与VisualStudio可执行文件相同的位置。创建后,在单独的行中列出每个所需的“通用类型名称”。一个例

c# - 为什么我需要在泛型子类中重新声明类型约束

最近我尝试通过实现一个泛型接口(interface)来创建一个泛型子类。publicinterfaceIModulewhereT:DataBean{.....}publicclassModule:IModulewhereT:DataBean{....}看来我不能依赖在基本接口(interface)中定义的任何T限制,我需要自己重新申报。MSDN刚刚提供:Whenusingthesubclassgenerictypeparameters,youmustrepeatanyconstraintsstipulatedatthebaseclasslevelatthesubclasslevel.F

c# - 为什么 ToList<Interface> 不适用于值类型?

如果我为值类型实现一个接口(interface)并尝试将其转换为它的接口(interface)类型的列表,为什么这会导致错误而引用类型转换得很好?这是错误:CannotconvertinstanceargumenttypeSystem.Collections.Generic.ListtoSystem.Collections.Generic.IEnumerable我必须明确地使用Cast转换它的方法,为什么?自IEnumerable是通过集合的只读枚举,它不能直接转换对我来说没有任何意义。下面是演示该问题的示例代码:publicinterfaceI{}publicclassT:I{}pu

c# - 为什么我应该返回 IList<T> 而不是 List<T>?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:C#-ListorIList写满了所以你应该返回IList从你的方法而不是List但我找不到任何真正好的理由。我一直在寻找执行此操作的代码,然后调用代码通常会执行以下两项操作之一:调用newList(returnedIList)所以它可以使用List上的所有好方法转换回List所以它可以使用List上的所有好方法第一个很笨重,第二个会抛出(运行时)InvalidCastException如果实现实际上更改为其他东西(这使得它完全愚蠢)。如果我使用List出于某种原因必须用IList的实现替换它我不能从List

c# - 基于泛型约束的方法重载?

我能否以某种方式拥有仅因泛型类型约束而不同的重载方法?这不编译:voidFoo(Tbar)whereT:class{}voidFoo(Tbar)whereT:struct{}由于这些是“开放”方法,当在代码中使用具体类型的T引用实际方法时,实际方法应该是封闭的/构造的/完全定义的,然后就会清楚是哪个过载调用。显而易见的解决方案是不要重载它们,但我想知道为什么这在C#中不起作用?附加问题:如果这只是一个C#编译器约束,IL是否允许这样的重载? 最佳答案 CanIsomehowhaveoverloadedmethodswhichdiff

c# - 我可以将类型对象传递给泛型方法吗?

这个问题在这里已经有了答案:HowdoIusereflectiontocallagenericmethod?(8个答案)关闭8年前。我的DataAccessLayer上有一个FindAll方法,如下所示:publicFindResultFindAll()whereT:Entity,new()和一个具有Type[]数组的客户端代码,它需要使用它来迭代调用FindAll方法,如下所示:foreach(vartypeintypeArray){varresult=DataAccessLayer.FindAll();...但是编译器提示“需要类型或命名空间”。有没有简单的方法来解决这个问题?我试

c# - 获取对动态对象中方法的泛型调用

我开始在.Net中使用动态对象,但我不知道该怎么做。我有一个继承自DynamicObject的类,我重写了TryInvokeMember方法。例如classMyCustomDynamicClass:DynamicObject{publicoverrideboolTryInvokeMember(InvokeMemberBinderbinder,object[]args,outobjectresult){//Iwanttoknowherethetypeofthegenericargument}}在该方法中,我想知道调用中通用参数的类型(如果有的话)。例如如果我调用以下代码,我想在我的动态对

c# - 具有泛型参数和抽象类的泛型

我有两个通用基类。第二个泛型类对第一个类的参数有约束。abstractclassFirstClass{...}abstractclassSecondClasswhereU:FirstClass{...}这不起作用,因为未定义FirstClass。所以我需要这样做。abstractclassFirstClass{...}abstractclassSecondClasswhereU:FirstClass{...}哪个有效。然而,这使得实现这些抽象类变得很丑陋。classSomeClass{...}classMyFirstClass:FirstClass{...}classMySecondC

c# - 将属性用于通用约束

这个问题在这里已经有了答案:Canyouuse"where"torequireanattributeinc#?(5个答案)关闭9年前。举个例子,比如..publicinterfaceIInterface{}publicstaticvoidInsert(thisIListlist,IListitems)whereT:IInterface{//...logic}这很好用,但我想知道是否可以使用属性作为约束。比如……classInsertableAttribute:AttributepublicstaticvoidInsert(thisIListlist,IListitems)whereT:

c# - 在 select 语句中使用命名元组

有没有更好的方法使用var目标变量在C#7中选择命名元组?我一定在示例1中做错了什么,或者完全误解了某些东西。我似乎必须明确设置目标类型才能执行此操作。//1.Failstocompilewith"incorrectnumberoftypeparameters"issue.vartuples=source.Select(x=>(x.A,x.B));//2.CompilesIEnumerabletuples=toCheck.Select(x=>(x.A,x.B));//3.Compilesvartuples=newHashSet(source.Select(x=>(x.A,x.B)));