2017-08-02 192 views
3

我在使用隱式轉換和IEnumerable時遇到了一個有趣的情況 - 請看附加代碼的最後一行 - 它不會編譯。隱式轉換IEnumerable轉換爲泛型

public class Outer<T> 
{ 
    private T field; 
    public Outer(T it) 
    { 
     field = it; 
    } 

    public static implicit operator Outer<T> (T source) 
    { 
     return new Outer<T>(source); 
    } 
} 

void Main() 
{ 
    Outer<string> intsample = "aa"; 
    Outer<IList<object>> listsample = new List<object>(); 

    //The line below fails with: 
    //CS0266 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<object>' 
    //to 'UserQuery.Outer<System.Collections.Generic.IEnumerable<object>>'. 
    //An explicit conversion exists (are you missing a cast?) 
    Outer<IEnumerable<object>> enumerablesample = Enumerable.Empty<object>(); 
} 

我有一個很強烈的直覺,它是興高采烈的IEnumerable是協變,但也有人更正式的解釋?

+0

爲什麼不直接投射? – Mafii

+0

因爲這只是示例來顯示問題,所以如果使用像LangugeExt和它的任一類型的庫,隱式轉換非常方便。不幸的是,我不明白將它標記爲重複,並指出關於方差和遺傳的不是如此相關的答案。 –

+0

@PatrickHofman我必須同意,這個問題不是直接由重複的答案。投票重新開放。 – Mafii

回答

2

The docs狀態:

類或結構允許聲明從源 型S轉換至T提供的所有以下屬實的目標類型:

  • S和T是不同的類型。
  • S或T是運算符聲明發生的類或結構類型。
  • S和T都不是對象或接口類型。 T是不是一個基類的S,S是不是一個基類T的

簡單的解決方法是改變:

Enumerable.Empty<object>(); 

到:

new List<object>(); 

這是因爲List不是一個接口(謝謝@PatrickHofman!)。

+1

你只是重複可以在這裏找到重複:https://stackoverflow.com/a/143567/993547 –

+3

它並不奇怪作品:'列表'不是一個接口,它是一個具體的類型。 –

+0

良好的通話 - 謝謝@PartrickHofman! – mjwills