无法为接口添加约束

jst*_*rdo 3 c# interface constraints

我有这个界面:

namespace Common.Extensions
{
    public interface IExtension
    {
        string FriendlyName { get; }
        string Description { get; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在其他类方法中,我有这个定义:

public void LoadExtensions<T>(T tipo) where T : Common.Extensions.IExtension
{

}
Run Code Online (Sandbox Code Playgroud)

在该方法的主体内部,我有这个:

T extension = Activator.CreateInstance(t) as T;
Run Code Online (Sandbox Code Playgroud)

其中"t"是从DLL动态加载的类型.该类型实现了IExtension接口.

使用该代码,我收到此编译时错误:

The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint
Run Code Online (Sandbox Code Playgroud)

根据文档,我想要做的是有效的.这里缺少什么?

海梅

Tit*_*mir 7

as操作者只能与参考类型或空类型(用于参考).如果接口是由struct实现的,as则无法使用它.

你可以约束T成为一个类

public void LoadExtensions(T tipo) where T : class, Common.Extensions.IExtension
Run Code Online (Sandbox Code Playgroud)

或者你可以使用常规演员:

T extension = (T)Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)

注意

您还可以new()向方法添加约束以强制T使用默认构造函数来避免运行时问题,并且根本不使用强制转换:

public static void LoadExtensions<T>(T tipo) where T : IExtension, new()
{
    T extension = new T();
}
Run Code Online (Sandbox Code Playgroud)

  • @jstuardo它的工作原理是因为为每个实例化编译了泛型方法,并针对它们编译的`T`(struct或class)类型进行了优化,以避免装箱. (2认同)