gpt4 book ai didi

c# - 类型 T 必须是引用类型,以便在使用接口(interface)时将其用作参数

转载 作者:太空狗 更新时间:2023-10-29 22:21:20 26 4
gpt4 key购买 nike

我收到以下代码的错误

public static Moq.Mock<T> CreateInstanceOfIMock<T>() {
return new Moq.Mock<T>();
}

我有solved使用引用的错误 class类型。请参阅下面的代码

public static Moq.Mock<T> CreateInstanceOfIMock<T>() where T : class
{
return new Moq.Mock<T>();
}

现在我想移动这个var mockColorsRepository = new Moq.Mock<IColorsRepository>();使用 generics 将代码转换为通用代码.这里IColorsRepository是一个 interface .所以我为T做了一个接口(interface)引用而不是 class就像下面的代码

public static Moq.Mock<T> CreateInstanceOfIMock<T>() where T : interface
{
return new Moq.Mock<T>();
}

但是我得到了 The type T must be a reference type in order to use it as parameter错误。我怎样才能引用 interface而不是 classT .我怎样才能做到这一点?

最佳答案

classstructgeneric type constaintsclass 的意思不同和 struct用于声明类或结构类型的声明。相反,它们仅限制泛型类型参数是引用类型 ( class ) 还是值类型 ( struct )。

所以当你做 where T : class不是T需要上课,你是说T需要是引用类型。同样struct对于值类型。

接口(interface)本身没有这个属性,所以一个接口(interface)既可以由引用类型实现,也可以由值类型实现。因此,将您的类型限制为接口(interface)并没有真正意义。

在您的情况下,Moq 要求您传递一个引用类型,因此您需要在所有辅助方法中传递该类型约束:

public static Moq.Mock<T> CreateInstanceOfIMock<T>()
where T : class
{
return new Moq.Mock<T>();
}

这就是创建任何有效类型的 mock 所需要做的全部。您可以使用 CreateInstanceOfIMock<IColorsRepository>() 将其与界面一起使用或任何其他类型。

当然,在这一点上,该方法并没有真正意义,因为与您自己实例化模拟相比,它不会给您带来任何好处。

关于c# - 类型 T 必须是引用类型,以便在使用接口(interface)时将其用作参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47567544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com