2017-05-20 102 views
4

我想返回一個T類型的值。泛型類型函數(屬性)

public T this[int index] 
{ 
    get 
    { 
      if (typeof(T) == typeof(int)) 
       return (T) dynEx[index].Int; 
      else if (typeof(T) == typeof(string)) 
       return (T) dynEx[index].Str; 
    } 
} 

dynEx是一個複雜的對象,它返回基於某個自定義表達式的對象。

上面的代碼顯然不起作用,因爲它有一個錯誤:「不能將類型'int'轉換爲T」並且「不能將類型'字符串'轉換爲T」。

如何在不影響性能的情況下實現這一目標?

這個屬性被稱爲每幀一千次以上(這是一個遊戲)。

+1

'T'與封閉類型有什麼關係? –

+0

如果你只關心2種類型,我認爲使用超載的策略比泛型更有意義。 – juharr

回答

3

爲了投射到int,您需要首先將結果投射到object,可能會拳擊。這很煩人,但不幸的是,它是C#泛型的一個限制 - 不幸的是,出於很好的理由,現在可以逃脫我。所以你想要:

public T this[int index] 
{ 
    get 
    { 
     if (typeof(T) == typeof(int)) 
     { 
      return (T) (object) dynEx[index].Int; 
     } 
     else if (typeof(T) == typeof(string)) 
     { 
      return (T) (object) dynEx[index].Str; 
     } 
     // TODO: Whatever you want to happen if T isn't int/string 
    } 
} 
+1

也許是因爲'T'可以是一個值或引用類型,所以在編譯時會有潛在的危險性。這是我的猜測。 –

+0

@MatíasFidemraizer:我認爲這部分是根據是否可以進行用戶定義的轉換,但我不會在不檢查的情況下推測太多:) –

+4

說實話,這不是「不幸」的C#泛型限制,不幸的是,有人撰寫過於泛型的非泛型類型。這基本上是濫用泛型的整個想法,我不知道爲什麼C#編譯器的人應該很容易編寫。 –