4

我很困惑。在为什么 .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);
    }

第二个编译。

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

如果接口是引用类型,为什么第一个代码片段无法编译?

4

2 回答 2

6

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

因为我可以拥有:

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

这是一个类型。

通过定义额外的约束,您声明这引用类型。

于 2013-07-15T08:20:49.917 回答
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用作参数“ ”TConsoleApplication4.Magician.Magic<T>(System.Func<object>, decimal)

于 2013-07-15T08:22:45.627 回答