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

4
我有些困惑。在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);
    }

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

2
值类型也可以实现接口。 - Bradley Smith
2个回答

6

这是关于接口内封装的对象的实际类型。仅声明 ISomeInterface,您并未定义必须条件:T 必须是引用类型。

例如,我可以有:

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

这是一个类型。

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


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”必须是引用类型,才能在泛型类型或方法“ConsoleApplication4.Magician.Magic(System.Func, decimal)”中用作参数“T”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接