Tag: generics

接口作为类型约束和接口作为参数之间的区别?

如果我想创建一个将IList实例作为参数(或任何其他接口,但让我们使用IList作为示例)的方法,我可以创建一个带有类型约束的generics方法,例如: public static void Foo1(T list) where T : IList { } 或者,我可以创建一个直接获取IList参数的方法: public static void Foo2(IList list) { } 出于所有意图和目的,似乎这些方法的行为完全相同: List myList = new List(); Foo1(myList); Foo2(myList); 所以这是我的问题 – 这两种方法之间的区别是什么? 似乎第二种方法稍微可读; 我应该注意哪些其他差异(生成不同的IL等)? 提前致谢。

将T限制为字符串和整数?

我已经为自己构建了一个generics集合类,它是这样定义的。 public class StatisticItemHits{…} 此类只能与int和string值一起使用。 不过这个 public class StatisticItemHits where T : string, int {…} 不会编译。 我究竟做错了什么?

从函数返回匿名类型

我可以在函数中使用匿名类型作为返回类型,然后将返回值的内容填充到某种类型的数组或集合中,同时还向新数组/集合添加其他字段吗? 请原谅我的伪代码…… private var GetRowGroups(string columnName) { var groupQuery = from table in _dataSetDataTable.AsEnumerable() group table by new { column1 = table[columnName] } into groupedTable select new { groupName = groupedTable.Key.column1, rowSpan = groupedTable.Count() }; return groupQuery; } private void CreateListofRowGroups() { var RowGroupList = new List(); RowGroupList.Add(GetRowGroups(“col1”)); RowGroupList.Add(GetRowGroups(“col2”)); RowGroupList.Add(GetRowGroups(“col3”)); }

Lazy 实现和.NETgenerics

我一直在寻找延迟初始化的方法,并找到了包含在.NET 4中的Lazy 。 我正在考虑使用自己的Lazy for .NET 3.5实现(使用更简单的multithreading策略),我遇到了以下问题: Lazy基本上有两种类型的构造函数: class Lazy { public Lazy(){…} // ctor #1 它使用T的默认构造函数来创建T的实例,和 public Lazy(Func func){…} // ctor #2 这让调用者决定如何创建T的实例。 现在问题在于: 如果我想要第一个ctor的编译时检查,我将添加一个限制 class Lazy where T: new() {…} 在class级。 这将允许我使用new T()来创建一个实例; 但是这个限制对于第二个ctor来说不是必需的,更糟糕​​的是,它也限制了我可以使用的类型(对于那些有默认ctor的人) 如果我想能够使用任何类型的第二个ctor,我将不会设置任何限制,并在第一个ctor将使用reflection,以确保T确实有一个默认的ctor。 但是,这种方法缺少编译时检查,如果第一个ctor使用了错误的类型,则只会抛出运行时exception。 我的问题是:我可以充分利用这两个世界吗? 理想情况下,我想对ctor#1的每次使用进行编译时检查,但同时能够将ctor#2用于没有默认ctor的类型。 Microsoft实现如何执行此操作? (我不能轻易访问.NET 4源代码或dll)。 编辑:(在“reflection器”MS组件之后) 我检查了参考实现,它没有进行编译时检查。 它使用reflection作为’默认ctor’的情况,当然如果事情变坏则伴随着运行时exception。

将盒装对象转换回原始类型

我希望有两个答案中的一个,要么不可能,要么非常简单,我忽略了明显的Google查询。 潜在的问题是我有一个通用对象通过EventHandler传入,它装入对象并模糊真实类型; 只有在运行时我才知道对象是什么。 不可否认, dynamic关键字可以解决这个问题,但我想不要失去智能感知,如果我可以避免它。 另外,它没有解决不知道通用对象的每个属性没有大量reflection的情况。 编辑:我们的想法是能够确定方法参数中对象的真实类型,然后在不事先知道的情况下将该对象转换为真实类型。 这只是一个简化的例子。 盒装可能是错误的术语。 一个例子: public class Program { static void Main(string[] args) { var container = new Container( new Containee { Property1 = Guid.NewGuid(), Property2 = “I’m a property!”, Property3 = DateTime.Now } ); var boxed = (object)container; var originalType = boxed.GetType(); // DOES NOT COMPILE: would like an […]

不应该ILookup 在TElement中被(声明)协变?

System.Linq.ILookUp定义读取 interface ILookup : IEnumerable<IGrouping>, IEnumerable { int Count { get; } IEnumerable this[TKey key] { get; } bool Contains(TKey key); } 由于IEnumerable在IGrouping 中是协变的,因此IGrouping 在TElement中是协变的,并且接口仅将TElement作为返回类型公开,我认为ILookup在TElement中也是协变的。 的确,定义 interface IMyLookup : IEnumerable<IGrouping>, IEnumerable { int Count { get; } IEnumerable this[TKey key] { get; } bool Contains(TKey key); } 编译没有问题。 那么,原始定义中缺少out关键字的原因可能是什么? 可能会添加Linq的未来版本吗?

.Equals中c#generics方法中的意外行为

为什么Equals方法从generics方法中返回不同的结果? 我认为这里有一些我不明白的自动拳击。 这是一个使用.net 3.5或4.0重现行为的示例: static void Main(string[] args) { TimeZoneInfo tzOne = TimeZoneInfo.Local; TimeZoneInfo tzTwo = TimeZoneInfo.FindSystemTimeZoneById(tzOne.StandardName); Console.WriteLine(Compare(tzOne, tzTwo)); Console.WriteLine(tzOne.Equals(tzTwo)); } private static Boolean Compare(T x, T y) { if (x != null) { return x.Equals(y); } return y == null; } 输出: False True 编辑:此代码按预期工作,没有多少妥协: private static Boolean Compare(T x, T y) { if […]

C#:在运行时获取类型参数以传递给Generic方法

通用方法是…… public void PrintGeneric2(T test) where T : ITest { Console.WriteLine(“Generic : ” + test.myvar); } 我从Main()调用它… Type t = test2.GetType(); PrintGeneric2(test2); 我收到错误“CS0246:无法找到类型或命名空间名称’t’和”CS1502:最佳重载方法匹配DoSomethingClass.PrintGeneric2 (T)具有无效参数“ 这与我之前的问题有关: C#:传递通用对象 我已经读过,在没有使用reflection或methodinfo的情况下,无法在运行时确定generics类型,但是在这个实例中我不太清楚如何这样做。 谢谢,如果你可以启发我=)

删除List 中的备用元素

在不使用占位符列表变量的情况下,在List删除备用(奇数索引或甚至索引)元素的最有效方法是什么? 如果您能提出每个答案的费用,我们将不胜感激。 我正在寻找一种有效的方法来做到这一点 提前致谢

在generics函数中使用重载operator ==

请考虑以下代码: class CustomClass { public CustomClass(string value) { m_value = value; } public static bool operator ==(CustomClass a, CustomClass b) { return a.m_value == b.m_value; } public static bool operator !=(CustomClass a, CustomClass b) { return a.m_value != b.m_value; } public override bool Equals(object o) { return m_value == (o as CustomClass).m_value; } public override […]