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

时间:2013-07-15 08:17:53

标签: c# .net

我很困惑。在Why are interfaces in .Net reference types?中,据说.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);
    }

第二次编译。

    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);
    }

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

2 个答案:

答案 0 :(得分:6)

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

因为我可以:

public interface IStructInterface {
}
public struct A : IStructInterface {
}

这是类型。

通过定义其他约束,您声明此引用类型。

答案 1 :(得分:0)

这是Magic class约束时收到的错误消息:

public ISomeInterface Magic<T>(Func<object> a, decimal d) where T:class

措辞可能更好,但当它说“T必须是参考类型......”时,它实际上意味着“T被限制为一个类”。此代码生成与OP相同的错误:

 class ABC {  
    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);
    }
}

interface ISomeInterface { }

class Magician
{
    public ISomeInterface Magic<T>(Func<object> a, decimal d) where T:class
    {
        throw new NotImplementedException();
    }
}
  

T”类型必须是引用类型才能在通用类型或方法“T

中将其用作参数“ConsoleApplication4.Magician.Magic<T>(System.Func<object>, decimal)