C# 为什么模板参数是接口,但我还是被要求使用;违约(I)“;?

C# 为什么模板参数是接口,但我还是被要求使用;违约(I)“;?,c#,templates,unity3d,interface,C#,Templates,Unity3d,Interface,我觉得这有点奇怪,我希望“I”只是一个接口类型,而T是一个实现该接口类型(或扩展它)的类 似乎我无法设置“null”值,或者无法正确地强制将模板限制为接口类型 public class MyClass< T, I> where T: I { private I myInterface = null; // error here. I have to use "default(I)" } 公共类MyClass其中T:I { private I myInterface=null

我觉得这有点奇怪,我希望“I”只是一个接口类型,而T是一个实现该接口类型(或扩展它)的类

似乎我无法设置“null”值,或者无法正确地强制将模板限制为接口类型

public class MyClass< T, I> where T: I
{
    private I myInterface = null; // error here. I have to use "default(I)"
}
公共类MyClass其中T:I
{
private I myInterface=null;//此处出错。我必须使用“default(I)”
}
我是否正确地强制使用“接口”?否则,我为什么必须使用“默认(I)”呢

使用I的原因是因为T重载了null check操作符(我使用的是Unity3D,因此我必须检查接口上的相等性以避免瓶颈)

事实上,我有:

public class MyClass< T, I>: MonoBehaviour, where T: MonoBehaviour, I
{
    private I myInterface = null; // error here. I have to use "default(I)"
}
公共类MyClass:monobhavior,其中T:monobhavior,I
{
private I myInterface=null;//此处出错。我必须使用“default(I)”
}

因为下面的代码是泛型类型参数的有效实现,所以您不能100%确定
t
是一个类(唯一可以为空的类型):


其中I:class做了这个把戏
!谢谢:),并且解释得非常简洁和有用
MyClass<int, IEquatable<int>> m;
public class MyClass<T, I> where T: I where I : class
{
    private I myInterface = null; // <-- now it is valid
}