Tag: generics

为什么C#不支持类构造函数中的genericstypes?

如果编译器可以推断它,C#不要求你指定一个genericstypes参数,例如: List<int> myInts = new List<int> {0,1,1, 2,3,5,8,13,21,34,55,89,144,233,377, 610,987,1597,2584,4181,6765}; //this statement is clunky List<string> myStrings = myInts. Select<int,string>( i => i.ToString() ). ToList<string>(); //the type is inferred from the lambda expression //the compiler knows that it's taking an int and //returning a string List<string> myStrings = myInts. Select( i => i.ToString() ). ToList(); 这是匿名types所需要的,你不知道types参数是什么(在intellisense中显示为'a ),因为它是由编译器添加的。 […]

两个C#扩展通用方法之间的模糊调用其中T:class和其他T:struct

考虑两种扩展方法: public static T MyExtension<T>(this T o) where T:class public static T MyExtension<T>(this T o) where T:struct 还有一堂课: class MyClass() { … } 现在在上面的类的一个实例上调用扩展方法: var o = new MyClass(…); o.MyExtension(); //compiler error here.. o.MyExtension<MyClass>(); //tried this as well – still compiler error.. 编译器说调用这个方法在我把它称作一个类时是一个模糊的调用。 我会认为它可以确定调用哪个扩展方法,因为MyClass是一个类,而不是一个结构?

C#方法重载决议不select具体的generics覆盖

这个完整的C#程序说明了这个问题: public abstract class Executor<T> { public abstract void Execute(T item); } class StringExecutor : Executor<string> { public void Execute(object item) { // why does this method call back into itself instead of binding // to the more specific "string" overload. this.Execute((string)item); } public override void Execute(string item) { } } class Program { static […]

C#相当于Java的<? 在generics中扩展Base>

在Java中,我可以做到以下几点:(假设Subclass extends Base ): ArrayList<? extends Base> aList = new ArrayList<Subclass>(); C#.NET中的等价物是什么? 没有? extends 显然? extends关键字,这是行不通的: List<Base> aList = new List<Subclass>();

为什么我不能使用System.ValueType作为generics约束?

为什么我不能使用where T : System.ValueType的约束? 为什么微软会阻止这种types的约束? 例: 为什么我不能做到以下几点? // Defined in a .Net class public void bar<T>(T a) where T : ValueType {…} // Defined in my class public void foo<T>(T a) where T : ValueType { bar<T>(a); } 在ValueType上使用struct有什么区别? // Defined in my class public void foo<T>(T a) where T : struct { bar<T>(a); }

Swift:检查genericstypes是否符合协议

我有一个协议,我这样定义: protocol MyProtocol { … } 我也有一个通用的结构: struct MyStruct <T> { … } 最后我有一个通用的function: func myFunc <T> (s: MyStruct<T>) -> T? { … } 如果Ttypes符合MyProtocol,我想在函数内部进行testing。 本质上我想能够做到(〜伪代码): let conforms = T.self is MyProtocol 但是这会引发一个编译器错误: error: cannot downcast from 'T.Type' to non-@objc protocol type 'MyProtocol' let conforms = T.self is MyProtocol ~~~~~~ ^ ~~~~~~~~~~ 我也试过变种,比如T.self is MyProtocol.self […]

从C#generics字典中过滤出值

我有一个C#字典, Dictionary<Guid, MyObject> ,我需要根据MyObject的属性进行过滤。 例如,我想从MyObject.BooleanProperty = false的字典中删除所有logging。 达到这个目标的最好方法是什么?

有没有一个通用的Task.WaitAll?

我开始几个并行的任务,像这样: var tasks = Enumerable.Range(1, 500) .Select(i => Task.Factory.StartNew<int>(ProduceSomeMagicIntValue)) .ToArray(); 然后join Task.WaitAll(tasks); 在最后一行,我得到一个蓝色波浪标记在tasks下,并带有警告信息: 从Task []到Task []的同variables数组转换 写操作可能导致运行时exception。 我明白为什么我会收到这个消息,但有没有办法解决这个问题呢? (例如,像Task.WaitAll()的通用版本?)

列出<BusinessObject>或BusinessObjectCollection?

在C#generics之前,每个人都可以通过创build一个实现了IEnumerable的集合库来为他们的业务对象编写集合 IE: public class CollectionBase : IEnumerable 然后从中得到他们的业务对象集合。 public class BusinessObjectCollection : CollectionBase 现在用generics列表类,没有人只是使用它呢? 我发现我使用这两种技术的妥协: public class BusinessObjectCollection : List<BusinessObject> 我这样做是因为我喜欢强types名称,而不是仅仅传递List。 你的方法是什么?

不能用将索引应用于types为“System.Collections.Generic.IEnumerable <>”的expression式

在IEnumerable中不允许build立索引是否有任何特定的原因。 我find了解决问题的方法,但只是好奇地知道为什么它不允许build立索引。 谢谢,