Tag: generics

C#genericsinheritance问题

我想将从generics中派生的不同类型的对象添加到基类型列表中。 我得到这个编译错误 Error 2 Argument 1: cannot convert from ‘ConsoleApplication1.Stable’ to ‘ConsoleApplication1.ShelterBase’ C:\Users\ysn\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs 43 26 ConsoleApplication1 我看不出问题你能为我提供另一种做这种事情的方法吗? abstract class AnimalBase { public int SomeCommonProperty;} abstract class ShelterBase where T : AnimalBase { public abstract List GetAnimals(); public abstract void FeedAnimals(List animals); } class Horse : AnimalBase { } class Stable : ShelterBase { public override […]

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

所以我读了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 […]

vNextdependency injection通用接口

我创建了一个ASP.Net vNext Web API。 我已经成功地使用了一个简单的接口,例如: services.AddScoped(); 但是,我无法弄清楚如何使用通用接口进行依赖性约定。 如何为此接口设置dependency injection: public interface IMongoConnectionHandler where T : IMongoEntity

如何使用out参数声明generics委托

Func ,只是不编译,如何声明我想要第二个参数是一个? 我想像这样使用它: public class Foo() { public Func DetectMethod; }

为什么我不能从List 转换为List ?

我有一个对象列表,它是我的类型QuoteHeader ,我想将此列表作为对象列表传递给一个能够接受List 。 我的代码行读了…… Tools.MyMethod((List)MyListOfQuoteHeaders); 但是我在设计时遇到以下错误…… Cannot convert type ‘System.Collections.Generic.List’ to ‘System.Collections.Generic.List’ 我是否需要对我的class级做任何事情才允许这样做? 我以为所有类都inheritance自对象,所以我无法理解为什么这不起作用?

将对象同时转换为两个接口,以调用generics方法

我想调用一个约束输入类型T的generics方法来实现两个接口: interface IA { } interface IB { } void foo(T t) where T : IA, IB { } 我怎样才能修复最后一行 void bar(object obj) { if (obj is IA && obj is IB) { foo((IA && IB)obj); } } ? 反思可能允许拨打电话,但我想留在语言中。

具有通用参数和抽象类的generics

我有两个通用的基类。 第二个generics类对其第一个类的参数有约束。 abstract class FirstClass {…} abstract class SecondClass where U : FirstClass {…} 这不起作用,因为没有定义FirstClass。 所以我需要这样做。 abstract class FirstClass {…} abstract class SecondClass where U : FirstClass {…} 哪个有效。 但是,这使得实现这些抽象类很难看。 class SomeClass {…} class MyFirstClass : FirstClass {…} class MySecondClass : SecondClass {…} 这对我来说似乎是多余的,因为我正在指定SomeClass两次。 有没有办法以这样的方式声明它,即FirstClass中的T自动为SecondClass的U. 我真的希望看起来像这样。 class SomeClass {…} class MyFirstClass : FirstClass {…} class […]

为什么在generics参数约束中强制执行某些排序?

在定义generics类型参数的约束时,我们必须将class()放在前面,将new()放在末尾。 为什么这样,为什么我不能按任何顺序放置约束? 除了class / struct之外,还有其他任何限制,最后是new()吗? 例: protected T Clone() where T : class, ICopyable, new()

通用扩展方法歧义

我定义了两个接口: // IVector.cs public interface IVector { int Size { get; } float this[int index] { get; set; } } // IMatrix.cs public interface IMatrix { int Size { get; } float this[int row, int column] { get; set; } } 以及这些接口的扩展方法 // VectorExtensions.cs public static T Add(this T vector, T value) where T : […]

在运行时构建c#Generic Type定义

目前我不得不做这样的事情来在运行时构建一个Type定义传递给我的IOC来解决。 简化: Type t = Type.GetType( “System.Collections.Generic.List`1[[ConsoleApplication2.Program+Person”); 我只知道运行时的generics类型参数。 有什么东西可以让我做这样的事情(假代码): Type t = Type.GetTypeWithGenericTypeArguments( typeof(List) , passInType.GetType()); 或者我只是坚持我的hack, passInType.GetType()转换为字符串,构建generics类型字符串..感觉脏