首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型构造要求类型“”IConditionalOperator“”具有公共默认构造函数

泛型构造要求类型“”IConditionalOperator“”具有公共默认构造函数
EN

Stack Overflow用户
提问于 2021-05-29 22:36:02
回答 1查看 43关注 0票数 0

我想创建一个类型层次结构,它应该实现泛型单元测试,使用抽象类型作为测试装置。同样的模式在C#中工作得很好,但是我遇到了一个编译器错误:“泛型构造要求类型'IConditionalOperator‘有一个公共默认构造函数。”:

代码语言:javascript
复制
   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#代码可以正常工作,如下所示:

代码语言:javascript
复制
   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> {}
EN

回答 1

Stack Overflow用户

发布于 2021-05-29 23:11:49

您已经定义了ConditionalOperatorTest<'T>,因此它要求'T具有默认构造函数,这意味着'T不能是一个接口。因此,不要将IConditionalOperator指定为'T,而是使用具体的PatternMatching类型:

代码语言:javascript
复制
type PatternMatchingTest() =
    inherit ConditionalOperatorTest<PatternMatching>()

进行此更改后,F#版本现在与原始C#代码相匹配:ConditionalOperatorTest<IfStatement>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67752579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档