为什么我们不能将委托实例转换为泛型类型T
?
考虑一个实用方法CreateDelegate
,它创建一个委托的T类型实例,即从MulticastDelegate
派生的类型。
T CreateDelegate<T>() {… }
很不幸,泛型无法将
T
约束为派生自 MulticastDelegate
的类型,编译时会出现以下错误:
尽管如此,此实用程序方法正在检查Constraint cannot be special class 'System.MulticastDelegate'
T
是否与 MulticastDelegate
兼容,并通过反射通过 Delegate::CreateDelegate
创建委托。但是,如果尝试将 Delegate::CreateDelegate
的结果转换为 T
,将会得到以下编译错误:
然而,如果我先将其转换为Cannot convert type 'System.Delegate' to 'T'
object
,然后再转换为 T
,就可以正常工作:T h = (T) ((object) Delegate.CreateDelegate(typeof(T), target, m));
为什么我们不能直接将委托转换为T?
T h = Delegate.CreateDelegate(typeof(T), target, m) as T;
? - Ehsan Sajjadas
和_cast_
两个操作符的行为应该保持一致。 - Miguel Gamboa