![](/img/trans.png)
[英]Why do I have to cast to type parameter and can't use the constrained type?
[英]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.