簡體   English   中英

為什么我不能將'as'用於限制為接口的泛型類型參數?

[英]Why can't I use 'as' with generic type parameter that is constrained to be an interface?

在下面的示例中(僅用於演示目的),如果T不受類約束,則此轉換:

var ret = objectA as T;

..會導致以下編譯錯誤:

類型參數“T”不能與“as”運算符一起使用,因為它沒有類類型約束或“類”約束。

我不明白為什么我不能這樣做。 由於我已將T限制為接口IObject ,因此編譯器應該知道T必須是接口類型,並且as操作應該是有效的。

public interface IObject
{
    string Id { get; set; }
}
public class ObjectA : IObject
{
    public string Id { get; set; }
}
public class ObjectFactory
{
    public T CreateObject<T>(string id) where T : IObject
    {
        ObjectA objectA = new ObjectA();
        var x = objectA as IObject; // this is good
        var ret = objectA as T; // why this 'as' cannot compile?
        return ret;
    }
    public T CreateClassObject<T>(string id) where T : class, IObject
    {
        ObjectA objectA = new ObjectA();
        var ret = objectA as T; // if T is class, this 'as' can compile
        return ret;
    }
}

因為我已經將T限制為接口IObject,編譯器應該知道T必須是接口類型並且'as'操作應該是有效的。

不, T不必是接口類型。 它必須是實現接口的類型 考慮:

public struct Foo : IObject
{
    public string Id { get; set; }
}

那么你期望CreateObject<Foo>("ff")做什么?

使用CreateObject上的class約束,該調用將無效,因為Foo不是引用類型 - 編譯器知道T是引用類型,因此objectA as T是可以的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM