【问题标题】:Instantiating of a class derived from a generic one that has params in its constructor实例化派生自在其构造函数中具有参数的泛型类的类
【发布时间】:2019-03-03 17:46:51
【问题描述】:

我有这个带有两个构造函数的通用类Foo<>。其中之一使用params 关键字接受可变数量的参数。另一个非泛型类Bar 派生自Foo<>。问题是Bar 不接受使用具有params 的构造函数进行实例化。

这是一个示例:

using System;

namespace ConsoleApp1
{
    class Foo<T> where T : IComparable<T>
    {
        private Foo() { }
        public Foo(params T[] list) : this() { }
    }
    class Bar : Foo<int> { }


    class Program
    {
        static void Main(string[] args)
        {
            Foo<int> foo = new Foo<int>(1, 2); // it compiles
            Bar bar = new Bar(1, 2); // but CS1729 here!
        }
    }
}

它给出了一个编译器错误:

Error CS1729: 'Bar' 不包含带 2 个参数的构造函数

我在这里错过了什么?

【问题讨论】:

    标签: c# generics constructor


    【解决方案1】:

    您缺少在Bar 中从Foo 实现该构造函数:

    class Foo<T> where T : IComparable<T>
    {
            private Foo() { }
            public Foo(params T[] list) : this() { }
    }
    
    class Bar : Foo<int>
    {
        public Bar(params int[] list) : base(list) { }
    }
    

    【讨论】:

      【解决方案2】:

      构造函数在 C# 中不被继承。如果你不指定构造函数,编译器会为你生成一个无参构造函数,它会调用基类的无参构造函数。如果您的类派生自没有任何非私有无参数构造函数的基类,则编译器会出错。

      因此,您让Bar 继承采用params T[]Foo 构造函数的计划永远不会奏效。

      事实证明,这里发生的事情是编译器已经意识到它可以通过传递一个空数组来生成一个调用基本Foo(params T[]) 构造函数的无参数构造函数。 See it here.

      在你的情况下,你需要给Bar它自己的构造函数:

      class Bar : Foo<int>
      {
          public Bar(params int[] list) : base(list) { }
      }
      

      【讨论】:

        【解决方案3】:

        这与泛型无关。只是构造函数默认情况下不会在子类中继承。 Foo&lt;int&gt; 有一个 params int[] 构造函数这一事实并不意味着Bar 也有它:

        并非基类的所有成员都被派生类继承。以下成员不会被继承:

        • 实例构造函数,调用它来创建类的新实例。每个类都必须定义自己的构造函数。

        (来自 MS Docs 上的 C# Inheritance Tutorial

        您必须为Bar 定义一个特定的构造函数并将基本调用链接到它:

         public Bar (params int[] list) : base(list) {}
        

        【讨论】:

          猜你喜欢
          • 2017-10-27
          • 1970-01-01
          • 2020-01-06
          • 2011-06-04
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多