无法隐式转换类型';uint';到';T';(来自类模板)

本文关键字:uint 转换 类型 | 更新日期: 2023-09-27 18:27:26

我正在将代码从C++转换为C#,但在泛型变量问题的向量部分遇到了一些问题。我是C#的初学者。

C++代码:

  Pvec(){}
  Pvec(size_t n): p(n) {}
  Pvec(size_t n, T v): p(n, v) {}
  template<class T2>
  Pvec(const vector<T2>& v) {
    for (int i = 0; i < p.size(); ++i)
      p[i] = v[i];
  }
  template<class T2>
  Pvec(const Pvec<T2>& v) {
    p.resize(v.size());
    for (int i = 0; i < v.size(); ++i)
      p[i] = v[i];
  }

C#代码(由我转换,但面临许多错误):

public class Pvec <T>
{
  private List<T> p = new List<T>();
  public Pvec()
  {
  }
  public Pvec(uint n)
  {
      this.p = n;
  }
  public Pvec(uint n, T v)
  {
      this.p = new List<T>(n, v);
  }
//ORIGINAL LINE: template<class T2>
  public Pvec<T2>(List<T2> v)
  {
    for (int i = 0; i < p.Count; ++i)
    {
      p[i] = v[i];
    }
  }
//ORIGINAL LINE: template<class T2>
  public Pvec<T2>(Pvec<T2> v)
  {
    p.resize(v.size());
    for (int i = 0; i < v.size(); ++i)
    {
      p[i] = v[i];
    }
  }

我在课堂上有两个以上的模板怎么样?

无法隐式转换类型';uint';到';T';(来自类模板)

您的代码有几个问题。首先,您正在尝试将uint分配给List<T>,但不存在这样的转换。此外,您正在尝试使用一个构造函数设置List<T>,该构造函数获取类型为int而非uint的计数。你需要做什么:

  1. 使用使用List<T>构造函数的this.p = new List<T>()
  2. 要么接受int,要么将uint强制转换为int
  3. 我将不实例化p的声明,因为您无论如何都要在构造函数中初始化它
  4. 使用构造函数链接

    public class Pvec<T>
    {
        private List<T> p;
        private const int DefaultVectorSize = 4;
        public Pvec() : this(DefaultVectorSize, default(T))
        {
        }
        public Pvec(uint n) : this((int)n, default(T))
        {
        }
        public Pvec(uint n, T v)
        {
           var capacity = (int)n;
           p = EqualityComparer<T>.Default.Equals(v, default(T)) ? 
                                new List<T>(capacity) { v } : new List<T>(capacity);
        }
    }
    

或者:

public class Pvec<T>
{
    private List<T> p;
    private const int DefaultVectorSize = 4;
    public Pvec() : this(DefaultVectorSize, default(T))
    {
    }
    public Pvec(int n) : this(n, default(T))
    {
    }
    public Pvec(int n, T v)
    {
        p =  EqualityComparer<T>.Default.Equals(v, default(T)) ? 
                                new List<T>(n) { v } : new List<T>(n);
    }
}

旁注-为参数提供有意义的名称。

这是错误的:

public Pvec(uint n)
{
    this.p = n;
}

您正试图将uint分配给列表。在C++代码中,uintvector的大小。您需要在C#中对此进行镜像。你可以这样做:

public Pvec(int n)
{
    p = new List<T>(n);
}

注意-我从uint更改为int,因为这是列表构造函数的类型。您可以将其保留为uint,并在构造函数中处理转换,但同时警告您可能会传入溢出的值。