gpt4 book ai didi

c# - 对类型参数数组的约束

转载 作者:太空宇宙 更新时间:2023-11-03 22:45:52 25 4
gpt4 key购买 nike

在下面的方法中:

public void Foo(params Type[] types) {}

我如何限制types,使传入的每个Type 都必须派生自某个基类?

我想要类似这样的东西:

public void Foo(params Type[] types) where each types : BaseClass {}

澄清:

我想要从 BaseClass 派生的类的类型,而不是它们的实例。

例如,如果 BarBaseClass 的子类,我希望能够传入 typeof(Bar),而不是 新酒吧()

最佳答案

如果你想传递一组 Type 对象,你不能做你想做的。这是因为约束是类型系统的一部分 - 您可以设置一个方法来获取 int 类型的参数,或者设置一个泛型方法来接收从 IDisposable 派生的泛型类型参数,或其他任何东西,但你所拥有的已经是一个特定的具体类型 - Type

令人困惑的是,

类型 不是类型系统 的一部分。它只是一个常规类,恰好描述了类型系统元数据。但这只是任何旧类(class)。

能够将方法限制为仅接受 BaseClass 属性为 MyBaseClassType 实例就像能够限制方法一样只接受 Length == 3string 参数 - 这不是 type 的问题(如 C# 所见),而是 这些类型中的数据

当然,在其他语言中能够创建受限类型并非闻所未闻 - 创建一个 TLA 类型,它是 string 的类型,它必须是长度 3 - 但这不是 C# 的类型系统(当前)的工作方式。

可以做的是使用泛型类型参数作为包装器:

public void Foo<T1, T2, T3>() where T1 : BaseClass, T2:BaseClass, T3:BaseClass
{
// call untyped Foo.
Foo(typeof(T1), typeof(T2), typeof(T3));
}

这在某些情况下为您提供了更强的类型安全性,但它不会让您能够像 params [] 那样传递无限制的类型列表。

这在概念上类似于用类型化包装方法包装接受 object 参数的方法。如果您的 Add(object obj) 令人困惑,请将其隐藏并公开 Add(int i) { Add((object)i);Add(string s) { 添加((对象)s);}

关于c# - 对类型参数数组的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49967778/

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