gpt4 book ai didi

.net - 这是在滥用通用类型系统吗?

转载 作者:行者123 更新时间:2023-12-01 11:55:32 25 4
gpt4 key购买 nike

假设我们有一个编译成 .Net 的编译器,其中所有方法在所有类型(参数和局部变量)上都是通用的,并且您在编写方法时不会指定类型,而是指定约束。

编译后,方法可能如下所示:

interface IFoo<T> {
T Foo();
}
interface IBar<TParam, TResult> {
TResult Bar(TParam param);
}
public TResult FooBar<TItem, TParam, TIntermediate, TResult>(A item, B param)
where TItem: IFoo<TIntermediate>
where TIntermediate: IBar<TParam, TResult> {
return item.Foo().Bar(param);
}

它将具有用于此的语法,并且可以推断出类型,例如

FooBar = (item [I], param [P]) [I: IFoo<X>, X: IBar<P, R>] => [R] {
item.Foo().Bar(param)
}

大多数方法都是这样编译的程序(除了可以从用法中推断出确切类型的程序)是使用 .Net 的高级泛型类型系统还是滥用它?

例如,这样的事情会因为有太多的 jitted 类型而减慢 CLR 的速度,还是它会像正常代码一样“正常工作”?

最佳答案

结合泛型类型约束的过程存在一个主要问题:没有通用的方法来对对象进行类型转换,以便它可以传递给这样的例程——这种情况与没有这种类型参数的例程非常不同。

如果例程期望例如一个 IFoo 并且我想向它传递一些我认为是 IFoo 的对象,我可以将该对象转换为 IFoo 并将其传递给例程。如果对象可能是 IFoo,编译器将生成代码,假定对象是 IFoo,如果不是则失败。

如果例程接受泛型参数,传入的对象必须是满足所有约束的编译时类型。如果只有一个约束并且它是一个特定的基类型或接口(interface)(例如 IFoo),那很容易——将它转换为约束隐含的类型。类型转换后对象的编译型类型将满足约束条件,如果对象的运行时类型满足约束条件,则类型转换成功。

然而,如果想要调用其参数被约束以实现多个约束的例程 Wowzo,就会出现困难,例如接口(interface) IFoo 和基类 Wuzzle,但是想要传递给该例程的对象不共享任何满足约束的公共(public)基类型。例如,假设类 Wuzzle1、Wuzzle2 和 Wuzzle3 都实现了 IFoo,并且都继承自 Wuzzle,但是 Wuzzle 没有实现 IFoo。我有一个 Wuzzle 数组,其中的项目是 Wuzzle1、Wuzzle2 和 Wuzzle3 的混合物。如果数组元素恰好是 Wuzzle1,我可以将其转换为 Wuzzle1 并将其传递给 Wowzo。如果它恰好是 Wuzzle2,我可以将它转换为 Wuzzle2,然后将其传递给 Wowzo。 Wuzzle3 也是如此。不幸的是,没有很好的“通用”方式将数组元素传递给 Wowzo,而不必显式处理列表中可能存在的每种可能类型。

关于.net - 这是在滥用通用类型系统吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7691157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com