Tag: generics

generics:铸造和价值类型,为什么这是非法的?

为什么这是编译时错误? public TCastTo CastMe(TSource i) { return (TCastTo)i; } 错误: annot将类型’TSource’转换为’TCastTo’ 为什么这是一个运行时错误? public TCastTo CastMe(TSource i) { return (TCastTo)(object)i; } int a = 4; long b = CastMe(a); // InvalidCastException // this contrived example works int aa = 4; int bb = CastMe(aa); // this also works, the problem is limited to value types string […]

如何正确克隆List ?

可能重复: 如何在C#中克隆通用列表? List a1 = new List(); var new1 = a1; 现在,如果我改变a1那么new1也将被改变。 所以我的问题是如何正确克隆a1 ?

奇怪的重复模板模式和generics约束(C#)

我想在基类generics类中创建一个方法来返回派生对象的专用集合并对它们执行一些操作,如下例所示: using System; using System.Collections.Generic; namespace test { class Base { public static List DoSomething() { List objects = new List(); // fill the list somehow… foreach (T t in objects) { if (t.DoSomeTest()) { // error !!! // … } } return objects; } public virtual bool DoSomeTest() { return true; } } class […]

我可以使用+运算符的通用约束吗?

是否有一些“where”类型的约束可以添加以使下面的代码编译? public class Plus : BinaryOperator where T : … { public override T Evaluate(IContext context) { return left.Evaluate(context) + right.Evaluate(context); } } 谢谢 :)

动态声明generics类型实例

是否可以在设计时不知道类型的情况下声明generics的实例? 例: Int i = 1; List list = new List(); 我的类型可以是任何东西,而不是必须做: List list = new List<int();

如何获得更改原始对象的扩展方法?

我希望能够编写扩展方法,以便我可以说: lines.ForceSpaceGroupsToBeTabs(); 代替: lines = lines.ForceSpaceGroupsToBeTabs(); 但是,以下代码目前输出: ….one ……..two 代替: Tone TTtwo 我需要在以下代码中更改以使其输出: Tone TTtwo (请注意,对于可见性, . = space, T = \t ): using System; using System.Collections.Generic; namespace TestExtended82343 { class Program { static void Main(string[] args) { List lines = new List(); lines.Add(“….one”); lines.Add(“……..two”); lines.ForceSpaceGroupsToBeTabs(); lines.ForEach(l => Console.WriteLine(l)); Console.ReadLine(); } } public static class […]

动态创建模板的generics类型

我正在使用ChannelFactory编写WCF,它需要一个类型来调用CreateChannel方法。 例如: IProxy proxy = ChannelFactory.CreateChannel(…); 在我的情况下,我正在做路由,所以我不知道我的渠道工厂将使用什么类型。 我可以解析一个消息头来确定类型,但我在那里打了一堵砖墙,因为即使我有一个Type I实例也无法传递ChannelFactory期望generics类型的实例。 用非常简单的术语重述这个问题的另一种方法是我试图做这样的事情: string listtype = Console.ReadLine(); // say “System.Int32” Type t = Type.GetType( listtype); List myIntegers = new List(); // does not compile, expects a “type” List myIntegers = new List(); // interesting – type must resolve at compile time? 我可以在C#中使用这种方法吗?

C#中可能的部分generics类型推断?

我正在为我的IoC类库重写我的流畅界面,当我重构一些代码以便通过基类共享一些常用function时,我遇到了麻烦。 注意 :这是我想要做的事情,而不是我必须做的事情。 如果我必须使用不同的语法,我会,但如果有人知道如何使我的代码以我想要的方式编译,那将是非常受欢迎的。 我希望某些扩展方法可用于特定的基类,并且这些方法应该是通用的,具有一个generics类型,与方法的参数相关,但是这些方法还应返回与特定后代相关的特定类型。被引用。 使用代码示例比上面的描述更好。 这是一个简单而完整的例子, 它不起作用: using System; namespace ConsoleApplication16 { public class ParameterizedRegistrationBase { } public class ConcreteTypeRegistration : ParameterizedRegistrationBase { public void SomethingConcrete() { } } public class DelegateRegistration : ParameterizedRegistrationBase { public void SomethingDelegated() { } } public static class Extensions { public static ParameterizedRegistrationBase Parameter( this ParameterizedRegistrationBase p, string […]

通用方法和方法重载

方法重载允许我们定义许多具有相同名称但具有不同参数集的方法(因此具有相同的名称但签名不同)。 这两种方法是否超载? class A { public static void MyMethod(T myVal) { } public static void MyMethod(int myVal) { } } 编辑: 不应该声明A.MyMethod(myInt); 抛出错误,因为构造的类型A有两个具有相同名称和相同签名的方法?

将字符串解析为枚举类型

我有一个这样的枚举类型作为例子: public Enum MyEnum { enum1, enum2, enum3 }; 我将从配置文件中读取一个字符串。 我需要它来解析字符串到MyEnum类型或null o未定义。 不确定以下代码是否有效(对不起现在无法访问我的VS): // example: ParseEnum(“ENUM1”, ref eVal); bool ParseEnum(string value1, ref eVal) where T : Enum { bool bRet = false; var x = from x in Enum.GetNames(typeof(T)) where string.Equals(value1, x, StringComparison. OrdinalIgnoreCase) select x; if (x.Count() == 1 ) { eVal = Enum.Parse(typeof(T), […]