编译器不允许我进行潜在的不安全转换。我想知道怎么告诉它闭嘴。
List<T> _list = new List<T>();
B getFirst() { return (B) _list[0]; }
这是可能的,还是我必须写
B b = _myList[0] as B;
Debug.Assert( b != null );
return b;
我认为明确演员的观点是做不安全的操作。奇怪的是它不被允许。
答案 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
)并且T
到B
不存在转换,因此编译器停止。编译器实际上试图通过说类型T并不总是键入B来帮助你,但是你恰好有一些事情就像在运行时那样运行。
这是C#稍微令人困惑的一个方面:静态强制转换和动态强制转换使用相同的语法。像F#这样的语言使用不同的语法,如:>
和:?>
或VB.NET&#39; DirectCast
。