gpt4 book ai didi

c# - 对于泛型类型,IsConstructedGenericType 是否始终是 IsGenericTypeDefinition 的否定?

转载 作者:太空狗 更新时间:2023-10-29 19:41:12 26 4
gpt4 key购买 nike

实例属性的文档 Type.IsConstructedGenericType 不清楚或具有误导性。

我尝试了以下代码来查找此属性和相关属性的实际行为:

// create list of types to use later in a Dictionary<,>
var li = new List<Type>();

// two concrete types:
li.Add(typeof(int));
li.Add(typeof(string));

// the two type parameters from Dictionary<,>
li.Add(typeof(Dictionary<,>).GetGenericArguments()[0]);
li.Add(typeof(Dictionary<,>).GetGenericArguments()[1]);

// two unrelated type parameters
li.Add(typeof(Func<,,,>).GetGenericArguments()[1]);
li.Add(typeof(EventHandler<>).GetGenericArguments()[0]);

// run through all possibilities
foreach (var first in li)
{
foreach (var second in li)
{
var t = typeof(Dictionary<,>).MakeGenericType(first, second);
Console.WriteLine(t);
Console.WriteLine(t.IsGenericTypeDefinition);
Console.WriteLine(t.IsConstructedGenericType);
Console.WriteLine(t.ContainsGenericParameters);
}
}

代码贯穿了一个由36种组成的笛卡尔积t .

结果:对于 32 种类型(除了 4 种组合 Dictionary<int, int>Dictionary<int, string>Dictionary<string, int>Dictionary<string, string>),ContainsGenericParameters 的值是真的。

对于 35 种类型,IsGenericTypeDefinition IsConstructedGenericType 时为假是真的。对于最后一种类型,即(不出所料):

System.Collections.Generic.Dictionary`2[TKey,TValue]

IsGenericTypeDefinition是真的,IsConstructedGenericType是假的。

我能否得出结论,对于泛型类型,IsConstructedGenericType 的值总是 IsGenericTypeDefinition 的相反(否定) ?

(文档似乎声称 IsConstructedGenericTypeContainsGenericParameters 相反,但我们清楚地展示了很多反例。)

最佳答案

是的,这是正确的。假设所讨论的 Type 是泛型类型,则 IsGenericTypeDefinitionIsConstructedGenericType 中的一个为真。我们可以很容易地从reference source对于 RuntimeType(这是 Type 的具体实现,当您执行 GetType()typeof 时)为什么是这样的:

public override bool IsConstructedGenericType 
{
get { return IsGenericType && !IsGenericTypeDefinition; }
}

关于c# - 对于泛型类型,IsConstructedGenericType 是否始终是 IsGenericTypeDefinition 的否定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18796119/

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