Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在泛型类中强制强制强制转换_C# - Fatal编程技术网

C# 在泛型类中强制强制强制转换

C# 在泛型类中强制强制强制转换,c#,C#,编译器不允许我执行可能不安全的强制转换。我想知道怎么叫它闭嘴 List<T> _list = new List<T>(); B getFirst() { return (B) _list[0]; } 我认为显式强制转换的目的是执行不安全的操作。奇怪的是,这是不允许的。您可以向类添加类型约束: class Foo<T> where T: B { } 可以向类添加类型约束: class Foo<T> where T: B { } 首先将其强制转

编译器不允许我执行可能不安全的强制转换。我想知道怎么叫它闭嘴

List<T> _list = new List<T>();

B getFirst() { return (B) _list[0]; }

我认为显式强制转换的目的是执行不安全的操作。奇怪的是,这是不允许的。

您可以向类添加类型约束:

class Foo<T> where T: B { }

可以向类添加类型约束:

class Foo<T> where T: B { }
首先将其强制转换为对象,然后再转换为类型B,就像已经注释过的那样

return (B) (object) _list[0];

试着用下面这样的安全方法来铸造它。在返回之前检查空值,但将其强制转换为对象,然后转换为实际类型将是更通用的方法

B getFirst() 
{ 
    B b = _list[0] as B;
    if (b != null) 
    { 
        return b; 
    } 
}
首先将其强制转换为对象,然后再转换为类型B,就像已经注释过的那样

return (B) (object) _list[0];

试着用下面这样的安全方法来铸造它。在返回之前检查空值,但将其强制转换为对象,然后转换为实际类型将是更通用的方法

B getFirst() 
{ 
    B b = _list[0] as B;
    if (b != null) 
    { 
        return b; 
    } 
}

如果你想告诉编译器,相信我,我知道我在做什么,唯一的解决办法是先将它转换为object,然后再转换为B,正如接受的答案所述

作为一般规则,对象可以被强制转换为任何对象,而无需编译器的阻挠,它将根据运行时判断该强制转换是否是合法的动态强制转换

类型转换用于在类型信息丢失时,或者如果存在转换并且您试图告诉编译器使用该转换时,向编译器提供附加信息。编译器不允许您强制转换,因为类型信息没有丢失。它知道类型是t,并且不存在t到B的转换,因此编译器停止。编译器实际上是想帮你一个忙,说类型T并不总是类型B,但你恰好有这样一种方式,它在运行时就是这样工作的


这是C语言中稍微令人困惑的方面之一:静态转换和动态转换使用相同的语法。像F这样的语言使用不同的语法,比如:>和:?>或VB.NET的DirectCast。

如果你想告诉编译器,相信我,我知道我在做什么,唯一的解决方案是先将它转换为object,然后再转换为B,这是公认的答案

作为一般规则,对象可以被强制转换为任何对象,而无需编译器的阻挠,它将根据运行时判断该强制转换是否是合法的动态强制转换

类型转换用于在类型信息丢失时,或者如果存在转换并且您试图告诉编译器使用该转换时,向编译器提供附加信息。编译器不允许您强制转换,因为类型信息没有丢失。它知道类型是t,并且不存在t到B的转换,因此编译器停止。编译器实际上是想帮你一个忙,说类型T并不总是类型B,但你恰好有这样一种方式,它在运行时就是这样工作的


这是C语言中稍微令人困惑的方面之一:静态转换和动态转换使用相同的语法。像F这样的语言使用不同的语法,如:>和:?>或VB.NET的DirectCast。

先将其转换为object,然后再转换为B。我认为显式转换的全部目的是执行不安全的操作。您的假设是错误的。@L.B想详细说明吗?这里有点怪。:先将其播送到object,然后再播送到B。我认为显式强制转换的全部目的是执行不安全的操作。您的假设是错误的。@L.B想详细说明一下吗?这里有点异想天开:DI无法添加该约束。我需要的约束实际上是B:T的位置,这是不允许的,并且无论如何也不会使强制转换安全。因此,在这种情况下,编译器无法保证类型安全。那么您需要的强制转换是逆变的?i、 e字符串新对象?@MeirionHughes 1这可能是对逆变的错误使用。2所有派生到基础的强制转换都是隐式的,因此只有非数值和非用户定义的显式强制转换是基础到派生的。但是,需要B:T的约束来建立B从T派生的关系,并确保_列表可以包含B的对象。目前这仅在文档中指定。我无法添加该约束。我需要的约束实际上是B:T的位置,这是不允许的,并且无论如何也不会使强制转换安全。因此,在这种情况下,编译器无法保证类型安全。那么您需要的强制转换是逆变的?i、 e字符串新对象?@MeirionHughes 1这可能是对逆变的错误使用。2所有派生到基础的强制转换都是隐式的,因此只有非数值和非用户定义的显式强制转换是基础到派生的。但是,B:T的约束需要建立B从T派生的关系,并确保_列表可以包含B的对象。目前,这仅在文档中指定。我支持我的声明,即显式强制转换用于执行不安全的操作。将从“谁知道在哪里”接收到的对象进行强制转换是一种不安全的事情,它的好处就是成为普通的预泛型。将浮点值转换为int是另一种常见的不安全的事情。我不明白为什么编译器让我
将基类强制转换为派生类型是另一种不安全的事情,而不是将泛型类型强制转换为另一种类型。将从“谁知道在哪里”接收到的对象进行强制转换是一种不安全的事情,它的好处就是成为普通的预泛型。将浮点值转换为int是另一种常见的不安全的事情。我不明白为什么编译器允许我将基类强制转换为派生类型(另一种不安全的事情),而不是将泛型类型强制转换为其他类型。