首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从泛型类创建泛型类的变量

从泛型类创建泛型类的变量
EN

Stack Overflow用户
提问于 2017-01-11 09:48:05
回答 2查看 62关注 0票数 1

我想要创建一个类,它可以在to值之间保留一个数字。在这里,我创建了我的前两个泛型类。

第一个名为LimitRang,并保留两个极限范围变量;一个用于较低的范围,另一个用于顶部的范围。第二个名为NumberLimitRang,并保留该数字和第一类LimitRang。

当我尝试创建变量mvarRang时,LimitRang变量如何在NumberLimitRang的构造函数中接收到错误:“不能隐式地将'VariableTypes.Supplement.LimitRang‘类型转换为'T’。

我的LimitRang代码:

代码语言:javascript
复制
namespace VariableTypes.Supplement
{
/// <summary>
/// Manage the boundaries for a number.
/// </summary>
/// <typeparam name="T">The numberic type for the limit parameters</typeparam>
public class LimitRang<T> where T : IComparable
{
    private T mvarLowestLimitNumber;
    private T mvarHighestLimitNumber;

    /// <summary>
    /// The default constructor (between 0 and 100)
    /// </summary>
    public LimitRang()
    {
        if (Functions.IsNumericType(typeof(T)))
        {
            try
            {
                mvarLowestLimitNumber = (T)Convert.ChangeType(0, typeof(T));
                mvarHighestLimitNumber = (T)Convert.ChangeType(100, typeof(T));
            }
            catch
            {
                mvarLowestLimitNumber = default(T);
                mvarHighestLimitNumber = default(T);
            }
        }
    }
}
}

我的NumberLimitRang代码:

代码语言:javascript
复制
 namespace VariableTypes
 {
 /// <summary>
 /// Can contain a number that need to be between or equal to two limit numbers
 /// </summary>
 public class NumberLimitRang<T> where T : IComparable
 {
     private Supplement.LimitRang<T> mvarRang;
     private T mvarNumber;

    /// <summary>
    /// The default constructor (between 0 and 100/Number = 0)
    /// </summary>
    public NumberLimitRang(T mvarRang)
    {
        mvarRang = new Supplement.LimitRang<T>();
        mvarNumber = (T)Convert.ChangeType(0, typeof(T));
    }
}
}

即使将两个T替换为int,我仍然会收到错误:

代码语言:javascript
复制
-    private Supplement.LimitRang<int> mvarRang;

-        mvarRang = new Supplement.LimitRang<int>();

你能告诉我我做错了什么吗?

Thx很多

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-11 09:56:11

问题在于:

代码语言:javascript
复制
public NumberLimitRang(T mvarRang)
{
    mvarRang = new LimitRang<T>();
    mvarNumber = (T)Convert.ChangeType(0, typeof(T));
}

您将mvarRang作为参数传递,并且有名为mvarRang的字段。但是在方法NumberLimitRang编译器中使用mvarRang作为参数,wich类型的T和tryes用new LimitRang<T>();替换它的值。因此,首先,重命名字段或参数。例如:

代码语言:javascript
复制
public class NumberLimitRang<T> where T : IComparable
{
    private LimitRang<T> _mvarRang;
    private T _mvarNumber;

    /// <summary>
    /// The default constructor (between 0 and 100/Number = 0)
    /// </summary>
    public NumberLimitRang(T mvarRang)
    {
        _mvarRang = new LimitRang<T>();
        _mvarNumber = (T)Convert.ChangeType(0, typeof(T));
    }
}

在开始时用_命名字段是很好的做法。

但是现在,您的论点mvarRang是不被使用的。用代码修改您的逻辑。

票数 0
EN

Stack Overflow用户

发布于 2017-01-11 09:52:46

代码语言:javascript
复制
public NumberLimitRang(T mvarRang)
{
    mvarRang = new Supplement.LimitRang<T>();
    mvarNumber = (T)Convert.ChangeType(0, typeof(T));
}

构造函数接受类型为mvarRang的变量T。此声明隐藏类型为mvarRang的实例成员LimitRang<T>

要么更改参数名称,要么使用this显式引用实例成员

代码语言:javascript
复制
public NumberLimitRang(T mvarRang)
{
    this.mvarRang = new Supplement.LimitRang<T>();
    mvarNumber = (T)Convert.ChangeType(0, typeof(T));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41587451

复制
相关文章

相似问题

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