Tag: 逆变

为什么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。 任何人都可以解释为什么约束不允许这个编译?

无法将MyType 隐式转换为MyType

我不确定这是否是Covariance和Contravariance问题,但我不能让这个工作。 这是代码: public interface IDto { } public class PaginatedDto where TDto : IDto { public int PageIndex { get; set; } public int PageSize { get; set; } public int TotalCount { get; set; } public int TotalPageCount { get; set; } public bool HasNextPage { get; set; } public bool HasPreviousPage { get; […]

如何创建具有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 […]

如何找到两种类型之间最佳拟合的最小协变类型?

IsAssignableFrom方法返回一个布尔值,指示是否可以从另一个类型分配一个类型。 我们怎样才能测试它们是否可以相互分配,还能知道最小协变类型以获得最佳拟合? 考虑以下示例(C#4.0) 码 // method body of Func is irrelevant, use default() instead Func x = default(Func); Func y = default(Func); Func f = default(Func); Func g = default(Func); g=x; g=y; y=x; // won’t compile x=y; // won’t compile // following two are okay; Array is the type for the covariance f=x; // Array […]

为什么不将违反方案委托给价值类型?

此代码段未在LINQPad中编译。 void Main() { (new[]{0,1,2,3}).Where(IsNull).Dump(); } static bool IsNull(object arg) { return arg == null; } 编译器的错误消息是: ‘UserQuery.IsNull(object)’没有重载匹配委托’System.Func’ 它适用于字符串数组,但不适用于int[] 。 这显然与拳击有关,但我想知道细节。