Tag: 协方差

在C#中协变使用genericsLazy类

假设这适用: public class Cat : Animal { } 并假设我有一个方法: public void Feed(Animal animal) { … } 我可以这样称呼它: var animal = new Cat(); Feed(animal); 当Feed被重构为仅支持Lazy作为参数时,如何才能使其正常工作? 我想传入我的var lazyAnimal = new Lazy(); 不知何故。 这显然不起作用: var lazyAnimal = new Lazy(); Feed(lazyAnimal);

协方差也在3.5 / 2.0?

奇怪的问题…… 我已经从例子中实现了协方差。 我的目标FW是4.0。 怎么样 我想看看它是否在3.5 / 2上失败 – >但它不会。 因为协方差来自FW4.0,所以不可能。 更改为3.0后我构建并看到:(+在运行时不会失败)

如何计算协方差矩阵

这个问题看起来令人惊讶地模糊不清…我在谷歌发布之前问过谷歌,我发现的最接近的事情就像这样: 协方差矩阵计算 但是,从评论中我不确定答案。 在C#中正确计算协方差矩阵的最佳方法是什么? 任何好的免费图书馆? 谢谢!

为什么inheritance不按我认为应该工作的方式工作?

我有一些inheritance问题,因为我有一组相互关联的抽象类需要全部重写以创建客户端实现。 理想情况下,我想做类似以下的事情: abstract class Animal { public Leg GetLeg() {…} } abstract class Leg { } class Dog : Animal { public override DogLeg Leg() {…} } class DogLeg : Leg { } 这将允许任何使用Dog类的人自动获取DogLegs以及使用Animal类获取Legs的任何人。 问题是被覆盖的函数必须与基类具有相同的类型,因此不会编译。 我不明白为什么不应该这样,因为DogLeg可以隐式地施放到Leg。 我知道有很多方法可以解决这个问题,但我更好奇为什么这不可能/在C#中实现。 编辑 :我有点修改,因为我实际上在我的代码中使用属性而不是函数。 编辑 :我将其更改回函数,因为答案仅适用于那种情况(属性的set函数的value参数的协方差不应该起作用)。 对不起波动! 我意识到这使得许多答案看起来无关紧要。

Action的通用约束无法按预期工作

我无法理解为什么以下代码段不会给我一个错误 public void SomeMethod(T arg) where T : MyInterface { MyInterface e = arg; } 但是这个,我期望由于generics类型约束而工作 private readonly IList<Action> myActionList = new List<Action>(); public IDisposable Subscribe(Action callback) where T: MyInterface { myActionList.Add(callback); // doesn’t compile return null } 给出了这个错误 cannot convert from ‘System.Action’ to ‘System.Action’ 我正在使用VS2012 sp1和.NET 4.5。 任何人都可以解释为什么约束不允许这个编译?

Autofac:使用in和out类型参数解析变体类型

这个问题是我之前提出的问题的后续问题: Autofac:隐藏一个复合背后的多个逆变实现 。 我试图找到我们可以用Autofac的协方差和逆变支持做些什么的边界。 我注意到Autofac的ContravariantRegistrationSource仅支持具有使用in关键字标记的单个generics参数的通用接口。 这似乎限制了这个function的实用性,我想知道Autofac是否有其他方法来扩展协方差和逆变的支持。 我必须承认,由于我正在使用的真实应用程序设计,我不是在问这个问题。 为了教育,我故意试图找到Autofac的限制。 请考虑以下界面: public interface IConverter { TOut Convert(TIn value); } 以下实施: public class ObjectToStringConverter : IConverter { string IConverter.Convert(object value) { return value.ToString(); } } 以下注册: var builder = new ContainerBuilder(); builder.RegisterSource(new ContravariantRegistrationSource()); builder.RegisterType() .As<IConverter>(); var container = builder.Build(); 通过这种设计和配置,我希望能够做到这一点: // This call succeeds because IConverter is // […]

用C#计算马哈拉诺比斯距离

我正在尝试用c#计算马哈拉诺比斯距离。 我在网上找不到任何真正好的例子,我是C#的新手。 我特别难以让协方差矩阵运行正常。 任何帮助,将不胜感激。 谢谢! using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MathNet.Numerics.LinearAlgebra.Double; namespace MahalanobisDistance { class Program { static void Main(string[] args) { Program p = new Program(); DenseVector vector1 = new DenseVector(4); DenseVector vector2 = new DenseVector(4); DenseMatrix matrix1 = new DenseMatrix(vector1.Count/2); vector1[0] = 1; vector1[1] = 2; vector1[2] […]

使用嵌套类型参数和递归(C#)

我试图利用嵌套的参数类型,这似乎是非法的。 我宁愿将递归函数保持在下面,以便我不必复制逻辑。 但是我嵌套使用会使CLR非常不高兴(请参阅代码中列出的错误)。 MyMethod中的逻辑不可避免地创建Action和Action两种类型的委托。 有没有办法改变下面的代码来实现我的目标? 关于使用类型参数(即 )的一般限制是什么? 也许类型安全性的丧失是禁止此类代码的原因? ClassA-> ClassB(inherets) public void MyMethod(Action actionDelagate) where Ttype : ClassB { // Recursive Call with Ttype=ClassA if (Only able create Class A delagate) MyMethod(v => doStuff) // Recursive Call with Ttype=ClassB if (Only able create Class B delagate) MyMethod(v => doStuff) // Utilize Delagate if (TypeOf(Ttype) == […]

Covariance / Contravariance不应该在C#4.5中允许这样吗?

private Dictionary<Type, List> dataStore = new Dictionary<Type, List>(); public void Insert(T dto) where T : IDataTransferObject { if (!dataStore.ContainsKey(typeof(T))) { dataStore.Add(typeof(T), new List()); } dataStore[typeof(T)].Add(dto); } 上面的代码给出了dataStore.Add行的编译错误,因为它不喜欢我尝试将List分配给List 。 由于我的方法将T限制为只有IDataTransferObject,因此.Net 4中的协方差/反函数不应该允许这个代码吗? 我知道我可以改变它来做新的List它会工作,但我很好奇为什么原始代码不起作用。

使用基类作为IEnumerable 的通用

我对OOP一般,inheritance和多态,接口等有很好的理解。我遇到了一个奇怪的情况,我不明白为什么它根本不起作用… 编辑:好的,我发现协方差(或逆变?)可以解决这个问题,但至关重要 我们还在使用.NET 2.0 如何在不转向C#4.0的情况下解决这个问题? 这是情况。 鉴于这两个类: public class CustomCollectionType : IEnumerable { /* Implementation here, not really important */ } public class Entity : EntityBase { /* Implentation here, not important */ } 当我尝试使用这种通用方法时,编译器会抱怨 public void LoopThrough(IEnumerable entityList) { foreach(EntityBase entity in entityList) { DoSomething(entity); } } 并尝试以这种方式使用它: CustomCollectionType entityList; /* Add items to […]