Tag: 协方差

Autofac:隐藏一个复合材料背后的多个逆变实现

我被这个关于(.NET 4.0)协方差和逆向支持Autofac的问题引发了,现在我正在努力实现类似的东西,但没有任何运气。 我想要实现的是以这样的方式配置Autofac:当我解析单个具体的IEventHandler (为了使用container.Resolve进行演示,但通常使用构造函数注入),Autofac将返回一个MultipleDispatchEventHandler包装所有可从请求的处理程序分配的已注册事件处理程序。 换句话说,当我写这个: var handler = container .GetInstance<IEventHandler>(); handler.Handle(new CustomerMovedEvent()); 关于应用程序设计(如下所示),我希望返回一个包装CustomerMovedEventHandler和NotifyStaffWhenCustomerMovedEventHandler的MultipleDispatchEventHandler 。 这是应用程序设计: // Events: public class CustomerMovedEvent { } public class CustomerMovedAbroadEvent : CustomerMovedEvent { } public class SpecialCustomerMovedEvent : CustomerMovedEvent { } // Event handler definition (note the ‘in’ keyword): public interface IEventHandler { void Handle(TEvent e); } // Event handler […]

使用更多指定的返回类型覆盖抽象属性(协方差)

class Base {} abstract class A { abstract public List Items { get; set; } } class Derived : Base {} class B : A { private List items; public override List Items { get { return items; } set { items = value; } } } 编译器说B.Items必须是Base元素列表“匹配重写成员”A.Items。 我怎样才能做到这一点?

将Func 强制转换为Func 的更快方法?

有没有更快的方法将Fun为Func public static class StaticAccessors { public static Func TypedGetPropertyFn(PropertyInfo pi) { var mi = pi.GetGetMethod(); return (Func)Delegate.CreateDelegate(typeof(Func), mi); } public static Func ValueUnTypedGetPropertyTypeFn(PropertyInfo pi) { var mi = typeof(StaticAccessors).GetMethod(“TypedGetPropertyFn”); var genericMi = mi.MakeGenericMethod(pi.PropertyType); var typedGetPropertyFn = (Delegate)genericMi.Invoke(null, new[] { pi }); //slow: lambda includes a reflection call return x => typedGetPropertyFn.Method.Invoke(x, new object[] { […]

为什么C#不对generics做“简单”类推理?

只是好奇:当然,我们都知道generics类型推断的一般情况是不可判定的。 所以C#根本不做任何类型的子类型:如果Foo 是generics的, Foo 不是Foo 的子类型,或Foo 或其他任何你可能的类型做饭。 当然,我们都用丑陋的界面或抽象的类定义来解决这个问题。 但是……如果你不能解决一般问题,为什么不把解决方案限制在容易的情况下。 例如,在上面的列表中,显然Foo 是Foo 的子类型,并且检查它是微不足道的。 对于Foo 进行检查也是如此。 如果他们只是说,那么还有其他一些深深的恐怖会从深渊蔓延出来,我们会尽我们所能吗? 或者这只是微软语言人员的某种宗教纯洁? 更新: 这是一个非常古老的线程。 这些天,C#有var,它解决了我抱怨的一半,然后使用Linq风格的匿名代表,有一个很好的表示法,不需要输入相同的东西两次。 因此,我反对的所有方面都已经通过最近对C#的更改得到了解决(或者我只是花了一些时间来了解我刚发布post时刚刚介绍的内容……)我使用这些新内容现在在Isis2系统中可靠的云计算function(isis2.codeplex.com),我认为该库具有非常干净的外观和感觉。 看看它,让我知道你的想法)。 – Ken Birman(2014年7月)

代表协方差混乱难题!

为什么这不起作用? 我不能正确理解代表协方差吗? public delegate void MyDelegate(object obj) public class MyClass { public MyClass() { //Error: Expected method with ‘void MyDelegate(object)’ signature _delegate = MyMethod; } private MyDelegate _delegate; public void MyMethod(SomeObject obj) {} }

相同类型参数的协方差和逆变

C#规范声明参数类型不能同时具有协变性和逆变性。 这在创建协变或逆变接口时很明显,您可以分别使用“out”或“in”来修饰类型参数。 没有选项可以同时允许两者(“outin”)。 这种限制只是一种语言特定的约束,还是存在更深层次,更基本的理由,这种理由会使你不希望你的类型既是协变的又是逆变的? 编辑: 我的理解是arrays实际上既是协变的又是逆变的。 public class Pet{} public class Cat : Pet{} public class Siamese : Cat{} Cat[] cats = new Cat[10]; Pet[] pets = new Pet[10]; Siamese[] siameseCats = new Siamese[10]; //Cat array is covariant pets = cats; //Cat array is also contravariant since it accepts conversions from wider types cats = […]

String 可以在其中保存System.Object吗?

你觉得问题很奇怪吗? 是的,发生的事也很奇怪。 让我解释。 我从C#Arrays中找到了这个Covariance和Contravariance的片段 string[] strings = new string[1]; object[] objects = strings; objects[0] = new object(); Jon skeet解释说上面的代码会抛出ArrayTypeMismatchException ,正如所说的那样。 我做的是我在第3行放置一个断点,使用DebuggerVisualizer我手动设置objects[0] = new object()它不会抛出任何错误,它可以工作。 稍后检查strings[0].GetType()返回System.Object。 不仅System.Object可以通过上述过程在string []中设置任何类型。 我不知道这是怎么发生的我在那里提出我的问题作为评论在我看到这个但没有答案的同一个问题。 我很想知道背后发生了什么。 有人解释一下。 Edit1这甚至很有意思 在重现上述行为后试试这个 int len = strings[0].Length; 如果你把鼠标放在属性长度上是strings[0].Length threw ArgumentException和消息Cannot find the method on the object instance但实际上它没有抛出exception并且代码运行产生结果len=0

如何创建包含一组只有自己的类型或子类型为子类的generics类?

abstract class Animal { } class Mammal : Animal { } class Dog : Mammal { } class Reptile : Animal { } class AnimalWrapper where T : Animal { public ISet<AnimalWrapper> Children { get; set; } } class Program { public static void Main(string[] args) { var foo = new AnimalWrapper(); foo.Children = new […]

如何创建具有inheritance的generics类?

如何使以下代码有效? 我不认为我完全理解C#generics。 也许,有人可以指出我正确的方向。 public abstract class A { } public class B : A { } public class C : A { } public static List GetCList() { return new List(); } static void Main(string[] args) { List listA = new List(); listA.Add(new B()); listA.Add(new C()); // Compiler cannot implicitly convert List listB = new […]

为什么List 在协变接口MyInterface 上无效

跟进前一个问题的问题 ,这被认为是一个共同变异问题。 更进一步,如果我按如下方式修改IFactory : class Program { static void Main(string[] args) { IFactory factory = new Factory(); } } class Factory : IFactory { } class Product : IProduct { } interface IFactory where T : IProduct { List MakeStuff(); } interface IProduct { } 我明白了: 方差无效:类型参数T必须在Sandbox.IFactory.MakeStuff()上不变地有效。 T是协变的。 为什么这不是无效的? 该如何/应该如何解决?