Tag: generics

为什么在generics类中重复嵌套types的字段声明会导致巨大的源代码增加?

场景是非常罕见的,但很简单:您定义了一个generics类,然后创build一个嵌套类,它从外部类inheritance,并在嵌套内定义一个关联字段(自我types)。 代码片段比描述更简单: class Outer<T> { class Inner : Outer<Inner> { Inner field; } } IL反编译后,C#代码如下所示: internal class Outer<T> { private class Inner : Outer<Outer<T>.Inner> { private Outer<Outer<T>.Inner>.Inner field; } } 这似乎是公平的,但是当你改变字段的types声明时,事情变得更加棘手。 所以当我更改字段声明 Inner.Inner field; 反编译之后,这个字段将如下所示: private Outer<Outer<Outer<T>.Inner>.Inner>.Inner field; 我明白,这个阶级的“嵌套”和inheritance不太相称,但是我们为什么要观察这样的行为呢? Inner.Inner types声明已经改变了types? Inner.Inner 和 Inner types在这种情况下有所不同? 当事情变得非常棘手 您可以在下面看到反编译的源代码 。 它真的很大,总共有12159个符号。 class X<A, B, C> { class […]

genericsNOT约束在T:!IEnumerable

按照标题,是否有可能在c#4中声明types – 否定约束?

如何从List <>投射ArrayList <>

有人可以解释我为什么我不能将第一种方法将List<>为ArrayList<> ,而我使用第二种方法呢? 谢谢。 第一种方法: ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token)); 第二种方法: ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));

通过generics类中的嵌套枚举的reflection获取枚举值

我需要通过reflection来打印出某些types的枚举值和相应的parsing值。 这在大多数情况下工作正常。 但是,如果枚举在genericstypes中声明, Enum.GetValues将引发以下exception: [System.NotSupportedException: Cannot create arrays of open type. ] at System.Array.InternalCreate(Void* elementType, Int32 rank, Int32* pLengths, Int32* pLowerBounds) at System.Array.CreateInstance(Type elementType, Int32 length) at System.Array.UnsafeCreateInstance(Type elementType, Int32 length) at System.RuntimeType.GetEnumValues() 完整的复制代码: using System; public class Program { public static void Main() { var enumType= typeof(Foo<>.Bar); var underlyingType = Enum.GetUnderlyingType(enumType); Console.WriteLine(enumType.IsEnum); foreach(var value […]

名单<? 扩展MyType>

我有一个关于generics的Java问题。 我宣布了一个通用列表: List<? extends MyType> listOfMyType; 然后在一些方法中,我尝试实例化并添加项目到列表中: listOfMyType = new ArrayList<MyType>(); listOfMyType.add(myTypeInstance); myTypeInstance只是MyTypetypes的对象; 它不会编译。 它说: 该方法添加(捕获#3 – ?扩展MyType)typesList <capture#3-of? 扩展MyType>不适用于参数(MyType) 任何想法?

如何定义一个实现接口的generics类并约束types参数?

class Sample<T> : IDisposable // case A { public void Dispose() { throw new NotImplementedException(); } } class SampleB<T> where T : IDisposable // case B { } class SampleC<T> : IDisposable, T : IDisposable // case C { public void Dispose() { throw new NotImplementedException(); } } 情况C是情况A和情况B的组合。这可能吗? 如何使案例C正确?

为什么在.NET中没有通用的同步队列?

我注意到你可以调用Queue.Synchronize来获得一个线程安全的队列对象,但是同样的方法在Queue <T>上是不可用的。 有谁知道为什么? 似乎有点怪异。

C#字典每键值两个值?

我有一个代码的情况下,一个Dictionary<string, string>似乎是最好的想法 – 我需要这些对象的集合,我需要他们通过一个唯一的键访问。 究竟是什么字典的概念是对的? 那么需求已经扩展到现在我需要为每个按键额外保留一点信息的地方(如果你好奇的话,它是一个布尔值)。 所以,我想通过扩展这个概念来创build一个带有string和布尔值的新数据结构,现在它已经成为一个Dictionary<string, NewCustomObject> 。 然而,像一个布尔标志只是一个额外的值,它只是感觉像矫枉过正。 但是我不知道每个键有两个值的字典式通用对象。 只是有一个自定义对象的词典是最好的方式去做这个或者有一些更简单的这种情况?

Javatypes作为GSON的参数

在GSON中获取你所做的对象列表 Gson gson = new Gson(); Type token = new TypeToken<List<MyType>>(){}.getType(); return gson.fromJson(json, token); 它工作的很好,但我想走得更远,并有MyType参数化,所以我可以有一个共同的function来parsing与此代码的对象的列表 // the common function public <T> List<T> fromJSonList(String json, Class<T> type) { Gson gson = new Gson(); Type collectionType = new TypeToken<List<T>>(){}.getType(); return gson.fromJson(json, collectionType); } // the call List<MyType> myTypes = parser.fromJSonList(jsonString, MyType.class); 可悲的是返回一个StringMaps数组,而不是types。 T被解释为另一种generics,而不是我的types。 任何解决方法?

在C#中,<T>代表什么?

我是C#的新手,直接修改我收到的项目的一些代码。 不过,我一直看到这样的代码: class SampleCollection<T> 我无法理解什么 <T> 意味着什么也不叫它。 如果有人愿意帮我指出这个概念的名称,我可以在网上search。 但是,我现在还是无能为力。