我很困惑。在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是引用类型,为什么第一个代码片段不能编译?
答案 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)
”