哪种是泛型类派生约束的首选语法?

Ste*_*uis 7 .net c# generics

记录的派生约束使用了一个where T :子句,我正在修改的示例代码是

public class TwoThingsIPC<T> where T : IPassClass
{ ...
}
Run Code Online (Sandbox Code Playgroud)

其中IPassClass是一个接口.

我使用的第三方代码具有格式

public class TwoThingsIPC<IPassClass>
{ ...
}
Run Code Online (Sandbox Code Playgroud)

两者都会在我的代码中产生相同的行为,但它们是否相同,如果没有,有什么区别?

D S*_*ley 9

他们不一样.第二项声明具有误导性:

public class TwoThingsIPC<IPassClass>
{ ...
}
Run Code Online (Sandbox Code Playgroud)

并没有限制类型的IPassClass接口.它对泛型参数使用了较差的名称选择.没有什么能阻止你创建一个实例TwoThingsIPC<int>- IPassClass类的代码中的引用只会被"替换" int.1

另一方面,类型的变量TwoThingsIPC<IPassClass>,例如:

TwoThingsIPC<IPassClass> myVar = new TwoThingsIPC<IPassClass>();
Run Code Online (Sandbox Code Playgroud)

确实将类型约束到IPassClass接口.


1这不是真正发生的事情,但我还没有更好的解释.