gpt4 book ai didi

c# - 开放通用类型是否被认为是具体的?我们如何通过参数化来限定抽象?

转载 作者:太空狗 更新时间:2023-10-29 23:24:33 28 4
gpt4 key购买 nike

您不能创建包含泛型参数的类型的实例。

但是,它不是抽象的或接口(interface)。

我正在阅读 StructureMap TypeExtensions我和助手遇到了:

public static bool IsConcrete(this Type type)
{
return (!type.IsAbstract && !type.IsInterface);
}

我对解释的方式不是很满意,因为看起来如果一个类型是具体的,那么它应该有一个实例。例如,我很难考虑像 typeof(List<>).MakeGenericType(typeof(List<>).MakeGenericType(typeof(List<>))) 这样的东西。成为一个具体的类型。

我知道 C# 中的开放泛型类型和 C# 中的抽象类型在它们偏离具体化的方式上有很大不同,但同时,它们都有一些从根本上抽象的东西。如果您认为抽象类和接口(interface)的参数是操作实现,则可以将其解释为参数化。但是,这有点偏离主题。

我真正想知道的是一种将这些概念与一致的语义统一起来的方法,这种语义不像List<List<List<>>>这样可憎的谎言。可以是具体的。我们是否有一种通用的方式来描述这种区别?

最佳答案

我不确定您的问题是否更多地是关于参数多态性与子类型多态性的哲学方面(我对类型理论的了解还不够多,无法回答)。

我选择以非常实用的方式阅读如下,希望这是你想知道的:

假设“具体”意味着“我可以创建它的实例 [*]”,并且如果不是 parametrized,则不能创建泛型实例。 , IsConcrete 的给定定义未能将泛型类型考虑在内。那么,如何以这样的方式扩展 IsConcrete

  • IsConcrete(typeof(List<>))是假的
  • IsConcrete(typeof(List<int>))是真的
  • IsConcrete(typeof(typeof(List<>).MakeGenericType(typeof(List<>).MakeGenericType(typeof(List<>))))是假的吗?

为此你可以使用 Type.ContainsGenericParameters

用于演示的快速 LinqPad 代码段:

var TListGen = typeof(List<>);
var TListInt = typeof(List<int>); // this would be "concrete" in the sense
// that its generic arguments
// are all parametrized
var TTest = typeof(List<>).MakeGenericType(typeof(List<>).MakeGenericType(typeof(List<>)));


(!TListGen.ContainsGenericParameters).Dump(); // False
(!TListInt.ContainsGenericParameters).Dump(); // True
(!TTest.ContainsGenericParameters).Dump(); // False

* 有一些问题,例如具有私有(private)构造函数的具体类型

关于c# - 开放通用类型是否被认为是具体的?我们如何通过参数化来限定抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832386/

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