2009-06-22 58 views

回答

19

轉換運算符不能是通用的。從規範部分10.10,這裏有一個轉換操作符說明符的格式:

conversion-operator-declarator: 
    implicit operator type ( type identifier ) 
    explicit operator type ( type identifier )

用,比如說比較一下,一個方法頭:

方法頭屬性選擇方法修飾符選擇部分選擇返回型 構件名類型參數列表選擇形式參數列表選擇類型參數約束子句 opt

(對不起格式化 - 不知道該怎麼做下注ter)

請注意,運算符格式不包含類型參數列表或類型參數約束。

2

您的代碼歸結到行:return new Foo<U>((U)a.Item)

如果你嘗試分配一個基類來一個繼承的類,這是不可能的。

假設T(基類)是Stream型和U是MemoryStream型(繼承類),你可以不分配給Stream類型MemoryStream的變量。

+0

當然你可以,如果引用將對象作爲一個Stream來屏蔽,但它實際上是一個MemoryStream,那麼你當然可以將它轉換成一個Memory Stream。這是一個合法的方法,問題是你不能真正指定運算符重載的通用約束... – LaserJesus 2009-06-22 05:54:37

+0

...如果你把我有的代碼表示爲方法而不是運算符重載,它會編譯 – LaserJesus 2009-06-22 05:56:09

0

它看起來像你想有一個逆變轉換的欺騙,但struct小號是不可變的,轉換並沒有購買任何東西,你可以簡單地說,就像@Gidon指出的new Foo<U>((U)a.Item)

如果你認爲是改變Foo是一個類,那麼我們可以做一些差異:

public interface IFoo<in T> { 
    T Item { 
     set; 
    } 
} 

public class Foo<T>:IFoo<T> { 
    public Foo(T item) { 
     this.Item=item; 
    } 

    public T Item { 
     get; set; 
    } 

    // public static explicit operator Foo<U>(U a) { 
    // return new Foo<U>((U)a.Item); 
    // } 
} 

,並用它喜歡:

var foo = new Foo<object>(new object { }); 
IFoo<String> bar = foo; 
bar.Item="123"; 
var b = Object.ReferenceEquals(foo, bar); // true 

順便說一句,方差泛型接口是隻能從.netfx 4.0獲得。

相關問題