我想创建一个类型层次结构,它应该实现泛型单元测试,使用抽象类型作为测试装置。同样的模式在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> {}发布于 2021-05-29 23:11:49
您已经定义了ConditionalOperatorTest<'T>,因此它要求'T具有默认构造函数,这意味着'T不能是一个接口。因此,不要将IConditionalOperator指定为'T,而是使用具体的PatternMatching类型:
type PatternMatchingTest() =
inherit ConditionalOperatorTest<PatternMatching>()进行此更改后,F#版本现在与原始C#代码相匹配:ConditionalOperatorTest<IfStatement>
https://stackoverflow.com/questions/67752579
复制相似问题