c#中显式转换和安全转换之间的区别

时间:2017-04-27 10:21:00

标签: c# casting explicit

第一个是工作,而第二个显示错误,有什么区别? 我阅读文档,并没有找到任何关于它的信息,它不是那么重要但想知道一些功能

public static string GetConcat2<T>(T q)
    {
        if(q.GetType() == typeof(A))
        {
            var z = q as A;
        }
        if (q.GetType() == typeof(A))
        {
            var z = (A)q;
        }
        return "!!!!";
    }
public interface CustomInteface
{
    string InterfaceProperty1 { get; set; }
    string InterfaceProperty2 { get; set; }
    string Concat();
}
public class A : CustomInteface
{
    public string InterfaceProperty1 { get; set; }
    public string InterfaceProperty2 { get; set; }
    public string Concat() {
        return InterfaceProperty1 + InterfaceProperty2;
    }
}

1 个答案:

答案 0 :(得分:1)

var z = (A)q;抛出错误,这意味着对象q不属于A类型。你试图施展的方式有点尴尬,你应该使用以下模式之一:

  • as后跟null检查:

    var z = q as A;
    if (z == null) { /*the cast failed*/ }
    
  • is后跟显式投射

    if (q is A)
    {
        var z = (A)q;
    }
    

注意,如果强制转换失败,第一个模式将返回null,第二个模式将抛出异常。这就是为什么你只在第二种情况下看到异常的原因,因为第一种情况是&#34;默默地&#34;失败。