2010-01-14 125 views
7

我對以下幾點感到困惑。C#.net鑄造問題

鑑於這種類:

public class SomeClassToBeCasted 
    { 
     public static implicit operator string(SomeClassToBeCasted rightSide) 
     { 
      return rightSide.ToString(); 
     } 
    } 

當我嘗試做以下爲什麼一個InvalidCastException拋出?

IList<SomeClassToBeCasted> someClassToBeCastedList 
    = new List<SomeClassToBeCasted> {new SomeClassToBeCasted()}; 
IEnumerable<string> results = someClassToBeCastedList.Cast<string>(); 

foreach (var item in results) 
{ 
    Console.WriteLine(item.GetType()); 
} 

回答

16

由於Cast()不與用戶指定的類型轉換處理 - 僅引用轉換(即,正常排序的基準的轉化向上或向下的繼承層次結構)和拳擊/拆箱轉換。這與演員在源代碼中所做的不一樣。不幸的是,這是沒有明確記載:(

編輯:只是把傑森的評論進入後,就可以解決這個很容易用投影:

IEnumerable<string> results = originalList.Select(x => (string) x); 
+3

而且,添加,就可以得到 「繞」 這跟'的IEnumerable 結果= someClassToBeCastedList.Select(X =>(串)X);' – jason 2010-01-14 16:14:12

6

如果只需要列表,你可以做

IEnumerable<string> results = 
     someClassToBeCastedList.Select(itm => itm.ToString()); 

代替。

+1

這甚至不使用用戶定義的演員,其中OP定義。 – jason 2010-01-14 16:22:21

+0

是的,這就是我的意思。這取決於在其他地方是否需要投射操作員功能。 – herzmeister 2010-01-14 17:23:03

-1

您可以使用此我得了類似的問題,它會幫助你

IEnumerable results = originalList.Select(x =>(string)x);