Tag: generics

不能将List <T>隐式转换为Collection <T>

这是一个编译器错误(为了可读性而稍作修改)。 这一个总是困惑我。 FxCop告诉这是一个不好的事情返回列表和派生从Collection<T>应该是可取的返回types。 此外,FxCop说可以使用List<T>进行内部数据存储\操作。 好吧,我明白了,但我没有得到的是编译器抱怨尝试隐式转换List<T>到Collection<T> 。 是不是更多的界面充电和function? 为什么禁止隐式转换? 而另一个源于上面的问题是: new List<int>(some collection<int>)构造函数是否昂贵? 谢谢, 瓦伦丁·瓦西里耶夫

C#generics能有一个特定的基types吗?

generics接口的types是否可能基于特定的父类? 例如: public interface IGenericFace<T : BaseClass> { } 显然,上面的代码不起作用,但如果是这样,我想告诉编译器是T必须是BaseClass的子类。 可以这样做,有计划吗? 我认为这对于一个特定的项目是有用的,在编译时确保一个通用的接口/类不用于非预期的types。 或者也可以对自我文档进行sorting:显示打算使用哪种types的文档。

我可以创build一个genericstypes的字典吗?

我想创build一个Dictionary对象,stringKeys,保存值是一个genericstypes。 我想它会看起来像这样: Dictionary<string, List<T>> d = new Dictionary<string, List<T>>(); 并让我添加以下内容: d.Add("Numbers", new List<int>()); d.Add("Letters", new List<string>()); 我知道我可以做一个string列表,例如,使用这个语法: Dictionary<string, List<string>> d = new Dictionary<string, List<string>>(); d.Add("Key", new List<string>()); 但是如果可能的话,我想做一个通用的列表… 那么2个问题: 可能吗? 什么语法? 非常感谢, 乔恩

List <Void>的目的是什么?

我甚至不知道这是可行的,但是我在线阅读一些代码时看到了这样一个签名的方法: public List<Void> read( … ) … 什么? 有没有理由这样做? 这份List甚至能持有什么? 据我所知,这是不可能实例化一个Void对象。

jackson真的无法将json反序列化成generics?

这是一个重复的问题,因为下面的问题要么混乱,要么根本没有答案: 反序列化-A-通用型与jackson jackson反序列化-到-运行指定的类 用jackson反序列化,generics类 jackson反序列化generics类variables 我希望这个问题能够最终find一个让问题清楚的答案。 有一个模型: public class AgentResponse<T> { private T result; public AgentResponse(T result) { this.result = result; } public T getResult() { return result; } } JSONinput: {"result":{"first-client-id":3,"test-mail-module":3,"third-client-id":3,"second-client-id":3}} 以及两种推荐的对generics进行反序列化的方法: mapper.readValue(out, new TypeReference<AgentResponse<Map<String, Integer>>>() {}); 要么 JavaType javaType = mapper.getTypeFactory().constructParametricType(AgentResponse.class, Map.class); mapper.readValue(out, javaType); jackson永远不能处理genericstypesT,它认为它是一个来自JavaType的Map,但是由于types擦除,它findObjecttypes的构造函数参数,并引发错误。 那么这是一个jackson错误,还是我做错了什么? 还有什么明确的TypeReference或JavaType规范? com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for […]

为什么编译器发出框指令来比较引用types的实例?

下面是一个简单的genericstypes,它具有一个唯一的通用参数约束引用types: class A<T> where T : class { public bool F(T r1, T r2) { return r1 == r2; } } 由csc.exe生成的IL是: ldarg.1 box !T ldarg.2 box !T ceq 因此,在进行比较之前,每个参数都是装箱的。 但是,如果约束指示“T”不应该是一个值types, 为什么编译器试图将r1和r2框 ?

generics与接口的实用优势

在这种情况下使用generics与接口有什么实际的优势: void MyMethod(IFoo f) { } void MyMethod<T>(T f) : where T : IFoo { } 也就是说,你可以在MyMethod<T>中做什么,你不能在非通用版本? 我正在寻找一个实际的例子,我知道理论上的差异是什么。 我知道在MyMethod<T> ,T将是具体types,但是我将只能在方法体内使用它作为IFoo。 那么这将是一个真正的优势?

Java中的通用树实现

有没有人知道Java的通用树(节点可能有多个孩子)的实现? 它应该来自一个值得信赖的来源,必须经过充分的testing。 这似乎不是自己实现它。 几乎让我想起我大学的时候,我们应该自己写所有的藏品。 编辑:在java.net上find这个项目 ,可能值得研究。

这是C#4中的协变错误吗?

在下面baseElements代码中,我希望能够隐式地从elements转换为baseElements因为TBase可以隐式转换为IBase 。 public interface IBase { } public interface IDerived : IBase { } public class VarianceBug { public void Foo<TBase>() where TBase : IBase { IEnumerable<TBase> elements = null; IEnumerable<IDerived> derivedElements = null; IEnumerable<IBase> baseElements; // works fine baseElements = derivedElements; // error CS0266: Cannot implicitly convert type // 'System.Collections.Generic.IEnumerable<TBase>' to // 'System.Collections.Generic.IEnumerable<IBase>'. // […]

如何编写通用数字的函数?

我对F#很陌生,发现types推断确实是一件很酷的事情。 但目前看来,这也可能导致代码重复,这不是一件很酷的事情 。 我想总结一个这样的数字的数字: let rec crossfoot n = if n = 0 then 0 else n % 10 + crossfoot (n / 10) crossfoot 123 这正确打印6 。 但现在我的input数字不适合int 32位,所以我必须将其转换为。 let rec crossfoot n = if n = 0L then 0L else n % 10L + crossfoot (n / 10L) crossfoot 123L 然后,一个BigInteger来我的方式,并猜测是什么… 当然,我只能拥有bigint版本,并根据需要向上投入input参数和输出参数。 但是首先我假设在int上使用BigInteger有一些性能惩罚。 […]