f# - 泛型构造要求类型“IConditionalOperator”具有公共默认构造函数
问题描述
我想创建一个应该实现通用单元测试的类型层次结构,使用抽象类型作为测试夹具。相同的模式在 C# 中运行良好,但我面临编译器错误:“泛型构造要求类型 'IConditionalOperator' 具有公共默认构造函数。”:
type Color =
| White = 0xFFFFFF
| Silver = 0xC0C0C0
| Gray = 0x808080
type IConditionalOperator =
abstract member GetName : Color -> string
type PatternMatching() =
interface IConditionalOperator with
member this.GetName color =
match color with
| Color.White -> "White"
| Color.Silver -> "Silver"
| Color.Gray -> "Gray"
| _ -> "None"
[<AbstractClass>]
type ConditionalOperatorTest<'T when 'T :> IConditionalOperator and 'T : (new : unit -> 'T)>() =
member this.ConditionalOperator_ReturnsName(name: string) = None
type PatternMatchingTest() =
inherit ConditionalOperatorTest<IConditionalOperator>()
相应的 C# 代码有效,如下所示:
public enum Color
{
White = 0xFFFFFF,
Silver = 0xC0C0C0,
Gray = 0x808080,
}
public interface IConditionalOperator
{
string GetName(Color color);
}
public class IfStatement : IConditionalOperator
{
public string GetName(Color color)
{
if (color == Color.White)
{
return "White";
}
else if (color == Color.Silver)
{
return "Silver";
}
else if (color == Color.Gray)
{
return "Gray";
}
else
{
return "None";
}
}
}
public abstract class ConditionalOperatorTest<T> where T : IConditionalOperator, new()
{
public void ConditionalOperator_ReturnsName(Color color, string name) {}
}
public class IfStatementTest : ConditionalOperatorTest<IfStatement> {}
解决方案
您已经定义ConditionalOperatorTest<'T>
了它需要'T
有一个默认构造函数,这意味着它'T
不能是一个接口。因此,不要指定IConditionalOperator
as 'T
,而是使用具体PatternMatching
类型:
type PatternMatchingTest() =
inherit ConditionalOperatorTest<PatternMatching>()
进行此更改后,F# 版本现在与原始 C# 代码匹配:ConditionalOperatorTest<IfStatement>
推荐阅读
- javascript - 如何使用 XPath 使用非标记文本在 div 中选择 div?
- python - Scipy 线性回归不包括`intercept_stderr` 属性
- oracle - 如何在一次查询中获取所有者的名称、他们的对象名称和该对象的大小?
- php - 在带有数组的 IN 语句之后,在 WHERE 语句中使用更多占位符
- javascript - 使用 localstorage 设置变量
- python - 在 Python 中忽略来自 Chromedriver 和 Selenium 的 UnexpectedAlertPresentException
- oracle - 在 oracle apex 中创建触发器时引发错误
- python - self 不应该添加多对多字段
- matlab - Matlab将矩阵元素复制到向量
- javascript - Vue JavaScript Mutiselect选项值不起作用