gpt4 book ai didi

c# - 为什么我不能将 int 转换为 T,但可以将 int 转换为 object,然后将 object 转换为 T?

转载 作者:太空狗 更新时间:2023-10-29 22:12:42 24 4
gpt4 key购买 nike

此代码无法编译:

public T Get<T>()
{
T result = default(T);
if(typeof(T) == typeof(int))
{
int i = 0;
result = (T)i;
}

return result;
}

但是,这段代码确实可以编译:

public T Get<T>()
{
T result = default(T);
if(typeof(T) == typeof(int))
{
int i = 0;
result = (T)(object)i;
}

return result;
}

该代码也可以正常工作。我不明白为什么编译器可以将对象(实际类型可以是任何类型)转换为 T,但不能将 int(从对象继承)转换为 T。

最佳答案

作为SLaks说,编译器知道 T 可以转换为对象,但这只是它的一半。编译器还知道类型为 T 的任何对象都派生自 object,因此它需要允许从 object 向下转换为 T。 v2.0 之前的集合需要这个。当然不是T,而是能够从对象向下转换为任何类型。除了对象之外,不可能从集合中取出任何东西。

当谈到 Tint 时,情况并非如此。由于 if 语句,您的代码在运行时当然不会出现这些问题,但编译器看不到。一般来说(虽然不是在这种情况下)证明在某些外部条件为真的情况下你永远不会到达 if 的主体是 NP-complete并且由于我们希望编译器在某个时候完成,它不会尝试基本上解决 millennium prize problem

在很多情况下,在非泛型代码中不允许用特定类型替换 T

如果您不能将代码编写为非通用代码以用特定类型替换 T,则它是无效的,不仅在这种情况下而且在一般情况下都是如此。如果您知道对于该方法的所有用例它实际上是有效的,您可以使用 constraints到您的通用方法。

关于c# - 为什么我不能将 int 转换为 T,但可以将 int 转换为 object,然后将 object 转换为 T?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8619948/

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