Tag: 决策

通用方法解决方案

请考虑以下代码: public class Tests { public void Test() { Assert.AreEqual(“Int”, DoSomething(1)); } public static string DoSomething(T value) { return “Generic”; } public static string DoSomething(int value) { return “Int”; } } 正如所料,将调用非genericsDoSomething方法。 现在考虑以下修改: public class Tests { public void Test() { Assert.AreEqual(“Int”, DoSomething(1)); } public static string DoSomething(T value) { return “Generic”; } public static […]

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

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

具有约束的generics方法的重载解决问题

代码示例: interface IFoo { } class FooImpl : IFoo { } static void Bar(IEnumerable value) where T : IFoo { } static void Bar(T source) where T : IFoo { } 任何人都可以解释,为什么这个方法调用: var value = new FooImpl[0]; Bar(value); 目标Bar(T source) (因此,不编译)? 在解决重载时,编译器是否会考虑类型参数约束? UPD 。 避免与数组混淆。 IEnumerable任何实现都会发生这种情况,例如: var value = new List(); UPD 2 。 @ […]