Tag: 类型约束

C#generics方法,在new()构造函数约束中输入参数

有没有办法创建一个使用new()构造函数约束的通用方法来要求具有特定类型的构造函数的类? 例如: 我有以下代码: public T MyGenericMethod(MyClass c) where T : class { if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null) { throw new ArgumentException(“Invalid class supplied”); } // … } 有可能有这样的东西吗? public T MyGenericMethod(MyClass c) where T : new(MyClass) { // … } 编辑:对此有一个建议 。 请投票,以便我们可以在C#中使用此function!

为什么generics类型约束会导致无隐式引用转换错误?

我创建了几个用于处理议程约会的接口和generics类: interface IAppointment where T : IAppointmentProperties { T Properties { get; set; } } interface IAppointmentEntry where T : IAppointment { DateTime Date { get; set; } T Appointment { get; set; } } interface IAppointmentProperties { string Description { get; set; } } class Appointment : IAppointment where T : IAppointmentProperties { public […]

给定“where T:new()”,“new T()”在内部使用Activator.CreateInstance吗?

如果我有一个类型参数约束new() : void Foo() where T : new() { var t = new T(); } new T()会在内部使用Activator.CreateInstance方法(即reflection)吗?

为什么类型约束不是方法签名的一部分?

所以我读了Eric Lippert的’Constraints不是签名的一部分’ ,现在我明白规范指定在重载解析后检查类型约束,但我仍然不清楚为什么必须如此。 以下是Eric的例子: static void Foo(T t) where T : Reptile { } static void Foo(Animal animal) { } static void Main() { Foo(new Giraffe()); } 这不会编译因为: Foo(new Giraffe())重载解析推断出Foo是最佳的重载匹配,但是类型约束失败并抛出编译时错误。 用埃里克的话说: 这里的原则是重载决策(和方法类型推断)找到参数列表和每个候选方法的forms参数列表之间的最佳匹配。 也就是说,他们会查看候选方法的签名。 类型约束不是签名的一部分,但为什么不能呢? 在某些情况下,考虑类型约束是签名的一部分是个坏主意吗? 难道或难以实施? 我并不是在提倡如果最佳选择的超载是出于无论什么原因无法调用的话,那么就会默默地回归到第二好的; 我讨厌那个。 我只是想了解为什么不能使用类型约束来影响最佳过载的选择。 我在C#编译器内部想象, 仅用于重载解析(它不会永久重写方法) ,如下所示: static void Foo(T t) where T : Reptile { } 变成了: static void […]