Tag: generics

使用List 而不是IEnumerable 有什么好处?

或者反过来? 我一直使用通用列表。 但我偶尔也会听到有关IEnumerables的消息,而且老实说我(今天)不知道它们是什么以及我为什么要使用它们。 所以,冒着在网上有东西永远更多地宣扬我的无知的风险,我谦卑地发布这个问题。

将类型参数约束为基本类型

我知道如何强制类型参数成为另一种类型的子类型: public interface IMapping { public void Serialize(T3 obj) where T3 : T2; } … var mapping = MapManager.Find(); mapping.Serialize(new TonkaTruck()); 有没有办法强制类型参数成为另一种类型的超类型? public interface IMapping { public void IncludeMappingOf() where T2 : T1; // <== doesn't work } … var mapping = MapManager.Find(); // Truck inherits Vehicle // Would like compiler safety here: mapping.IncludeMappingOf(); mapping.Serialize(new […]

使用genericsC#重载:错误还是function?

我们有一个以下简化示例: void Foo(IEnumerable collection, params T[] items) { // … } void Foo(C collection, T item) where C : ICollection { // … } void Main() { Foo((IEnumerable)new[] { 1 }, 2); } 编译说: 类型’System.Collections.Generic.IEnumerable’不能在generics类型或方法’UserQuery.Foo(C,T)’中用作类型参数’C’。 没有从’System.Collections.Generic.IEnumerable’到’System.Collections.Generic.ICollection’的隐式引用转换。 如果我将Main更改为: void Main() { Foo((IEnumerable)new[] { 1 }, 2); } 它会工作正常。 为什么编译器没有选择正确的重载?

generics和从差异类调用重载方法 – 优先级问题

首先,抱歉标题,但我想不出更好的事情…… 我的问题可以通过简单的代码示例呈现: public static class Test { public static int GetInt(T source) { return Convert.ToInt32(source); } } public static class Convert { public static int ToInt32(byte source) { return 30; } public static int ToInt32(object source) { return 10; } } 为什么Console.WriteLine(Test.GetInt(20)); 打印10 ,而不是30 ? 我一直认为.NET中的generics在运行时由JIT解决。 为什么然后抖动不够智能,发现有ToInt32(byte)方法,这适合我们的byte参数类型? 此行为使得Convert静态类方法在简单类型的装箱/拆箱操作中调用结果。

将对象转换为generics类型

我有一段时间没有睡觉所以这可能比我想象的要容易。 我有一个或多或少的generics类: public class Reference where T : APIResource //<- APIResource is abstract btw { private T _value = null; public T value { get { return _value; } } } 在其他地方,在自定义序列化方法中,有人传入的object实际上是Reference一个实例。 我只想跳到每个Reference对象都有的“value”属性,所以我想去: string serialize(object o) { return base.serialize( ((Reference) o).value ); } 当然,生活并不那么简单,因为正如编译器所说: using the generic type “Reference” requires 1 type arguments 我怎么能做我想做的事?

C#通用列表联盟问题

我正在尝试使用“联盟”合并2个列表,所以我摆脱了重复。 以下是示例代码: public class SomeDetail { public string SomeValue1 { get; set; } public string SomeValue2 { get; set; } public string SomeDate { get; set; } } public class SomeDetailComparer : IEqualityComparer { bool IEqualityComparer.Equals(SomeDetail x, SomeDetail y) { // Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; […]

是否可以为类型参数指定一个通用约束,以便从另一个类型转换?

假设我用以下内容编写了一个库: public class Bar { /* … */ } public class SomeWeirdClass where T : ??? { public T BarMaker(Bar b) { // … play with b T t = (T)b return (T) b; } } 后来,我希望用户通过定义他们自己的类型来使用我的库,这些类型可以转换为Bar并使用SomeWeirdClass“factory”。 public class Foo { public static explicit operator Foo(Bar f) { return new Bar(); } } public class […]

什么更有效:List .Add()或System.Array.Resize()?

我正在尝试确定List.Add()与使用Array.Resize()方法相比更有效。 Array.Resize的文档说它会复制整个数组,并将其放入一个新对象中。 必须丢弃旧对象。 这个旧对象在哪里? 在堆栈或堆上? 我不知道List.Add()是如何工作的。 有谁知道List.Add方法如何与静态Array.Resize方法进行比较? 我对内存使用(和清理)感兴趣,对于300种值类型更好,而不是20,000种值类型。 对于它的价值,我计划在.NET的嵌入式版本之一上运行此代码。 可能是.NET Gadgeteer

在Unity App.Config文件中包含generics类

我有一个类型ISimpleCache ,我想在ISimpleCache中添加为类型别名(然后是类型) 这条线 <typeAlias alias="ISimpleCacheOfIBrokeredDataObject" type="MyApplication.ISimpleCache, MyApplication” /> 由于显然是错误的,但我不相信逃避它们; 也是正确的。 我目前正在将我的代码拆分为使用Unity,因此距离可编译的代码库太远而无法快速测试,并希望在此处得到一些确认。

如何使用reflection来获取generics类型的扩展方法

从各种来源的teh interwebs我收集了以下function: public static Nullable TryParseNullable(this Nullable t, string input) where T : struct { if (string.IsNullOrEmpty(input)) return default(T); Nullable result = new Nullable(); try { IConvertible convertibleString = (IConvertible)input; result = new Nullable((T)convertibleString.ToType(typeof(T), CultureInfo.CurrentCulture)); } catch (InvalidCastException) { } catch (FormatException) { } return result; } 我把它变成了一个扩展方法,如果我直接调用它就可以正常工作: int? input = new int?().TryParseNullable(“12345”); 当我尝试使用另一个generics函数的上下文中的reflection来调用它时,我的问题就出现了。 SO充满了描述如何获得generics方法和静态方法的MethodInfo的答案,但我似乎无法以正确的方式将它们组合在一起。 […]