2017-04-27 84 views
-1

第一個工作正在進行,而第二個顯示錯誤,有什麼區別? 我閱讀文檔,並沒有發現任何關於它,它不是那麼重要,但要知道的一些功能顯式轉換和安全轉換之間的差異#

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; 
    } 
} 
+0

什麼是錯誤,它在哪裏拋出錯誤?嘗試提供重現問題所需的所有信息和代碼,包括[MCVE]。 – TheLethalCoder

+0

@ TheLethalCoder var z =(A)q; 這裏有一個錯誤,它無法強制類型A – GodlikeRabbit

回答

1

var z = (A)q;拋出一個錯誤,這意味着該對象qA類型的不行。你想投的方式是有點尷尬,以及你應該使用下列模式之一:

  • as其次null檢查:

    var z = q as A; 
    if (z == null) { /*the cast failed*/ } 
    
  • is其次是明確的轉換

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

注意f如果轉換失敗,第一個模式將返回null,第二模式將拋出異常。這就是爲什麼你只能在第二種情況下看到例外情況,因爲第一種情況是「默默」失敗。

+0

,因爲你可以看到,我檢查通用類型,所以它必須是正確的類型 if(q.GetType()== typeof(A)) – GodlikeRabbit

+0

@GodlikeRabbit是但不要這樣做,請嘗試以適當的方式進行。同時調試你的應用程序,看看實際是什麼'q'。 – TheLethalCoder