我正在使用Nsubstitute进行嘲弄。为了减少代码,我想编写一个伪造泛型属性的泛型类:
public class Tester<TValue>
where TValue: IValue
{
// this is used inside the class in other methods
private TValue CreateValue()
{
return Substitute.For<TValue>(); // here the compiler has an error
}
}
此代码在标记的位置给出了编译错误:
'TValue'类型必须是参考类型才能 在泛型类型或方法中将其用作参数“T” 'Substitute.For(params object [])'
这看起来很明显,因为Substitute
类的实现如下所示:
public static class Substitute
{
public static T For<T>(params object[] constructorArguments) where T : class;
}
我想知道的是,为什么这样的代码是可能的:Substitute.For<IValue>()
并且不会引发错误。任何人都能解释如何使用伪装来执行泛型类吗?
答案 0 :(得分:1)
以下代码应该有效:
public class Tester<TValue>
where TValue : class, IValue
{
// this is used inside the class in other methods
private TValue CreateValue()
{
return Substitute.For<TValue>(); // here the compiler has an error
}
}
The type must be a reference type in order to use it as parameter 'T' in the generic type or method可能值得一读。
必要的原因是Substitute.For
指定了引用类型(class
)。因此,它的任何通用调用者(比如你自己)都需要指定相同的class
约束。