Tag: 嵌套generics

嵌套generics:为什么编译器在这种情况下不能推断出类型参数?

当我遇到一个我不理解的类型推断错误时,我正在玩一个爱好项目。 我把它简化为以下简单的例子。 我有以下类和函数: class Foo { } class Bar { } class Baz { } static T2 F(Func f) { return default(T2); } static T3 G(Func<T1, Func> f) { return default(T3); } 现在考虑以下示例: // 1. F with explicit type arguments – Fine F(x => new Bar()); // 2. F with implicit type arguments – Also […]

为什么不能推断嵌套generics类型?

鉴于以下课程…… public abstract class FooBase where TBar : BarBase{} public abstract class BarBase{} public class Bar1 : BarBase{} public class Foo1 : FooBase {} ……以及以下方法…… public TBar DoSomething(TFoo theFoo) where TFoo : FooBase where TBar : BarBase { return default(TBar); } 为什么下面的代码行不能表示返回类型? Bar1 myBar = DoSomething(new Foo1()); 相反,我必须指定像这样的generics类型…… Bar1 myBar = DoSomething(new Foo1());

实现嵌套通用接口

我有以下类/接口: // Model public class A : IA { } // ModelLogic public class B : IB { } // Model Interface public interface IA { } // ModelLogic Interface public interface IB where T : IA { } 我尝试使用以下代码创建一个新实例: IB foo = new B(); 我收到以下错误: Cannot implicitly convert type ‘B’ to ‘IB’. An explicit […]

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

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