强制执行泛型类中的强制转换

时间:2014-06-30 19:20:43

标签: c#

编译器不允许我进行潜在的不安全转换。我想知道怎么告诉它闭嘴。

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

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

这是可能的,还是我必须写

B b = _myList[0] as B;
Debug.Assert( b != null );
return b;

我认为明确演员的观点是做不安全的操作。奇怪的是它不被允许。

3 个答案:

答案 0 :(得分:2)

您可以为班级添加类型约束:

class Foo<T> where T: B { }

答案 1 :(得分:2)

首先将其投放到object,然后投放到type B(就像已经评论过的那样)

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

OR

尝试以下面的安全方式进行投射。在返回之前检查是否为null,但是转换为object然后转换为实际类型将是更通用的方法。

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

答案 2 :(得分:1)

如果你想告诉编译器,&#34;相信我,我知道我在做什么&#34;,唯一的解决方案是首先将其转换为object,然后转换为B正如接受的答案所述。

作为一般规则,object可以转换为任何而不会妨碍编译器,它会延迟到运行时来判断该转换是否合法(动态转换) )。

当类型信息丢失时,或者如果存在转换并且您试图告诉编译器使用该转换时,使用Casting向编译器提供附加信息。编译器不允许您进行转换,因为类型信息不缺少(它知道类型为T)并且TB不存在转换,因此编译器停止。编译器实际上试图通过说类型T并不总是键入B来帮助你,但是你恰好有一些事情就像在运行时那样运行。

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