尽管接口是引用类型,为什么这段代码不能编译?

Sur*_*nut 4 .net c#

我很迷惑.在为什么在.net中引用类型的接口?据说.Net中的接口是引用类型.第一个代码片段无法编译.它说"T必须是参考类型......"

    public ISomeInterface DoMagic<T>(Expression<Func<object>> action, Tuple<string, DateTime, decimal> tuple) 
    where T : ISomeInterface 
    {
      Magician m = new Magician();
      return m.Magic<T>(()=> action, tuple.Item3);
    }
Run Code Online (Sandbox Code Playgroud)

第二个编译.

    public ISomeInterface DoMagic<T>(Expression<Func<object>> action, Tuple<string, DateTime, decimal> tuple) 
    where T : class, ISomeInterface 
    {
      Magician m = new Magician();
      return m.Magic<T>(()=> action, tuple.Item3);
    }
Run Code Online (Sandbox Code Playgroud)

如果Interfaces是引用类型,为什么第一个代码片段不能编译?

Tig*_*ran 6

因为它是关于封装在接口内部的对象的真实类型.通过声明ISomeInterface,你没有定义必须条件:T必须是引用类型.

因为我可以:

public interface IStructInterface {
}
public struct A : IStructInterface {
}
Run Code Online (Sandbox Code Playgroud)

这是一种价值类型.

通过定义其他约束,可以声明这引用类型.