错误7,参数1:无法从''转换为''

时间:2013-05-10 07:23:17

标签: c# list customization type-conversion

我遇到了一个我以前没见过的错误。我希望有人可以提供帮助。

这是我的代码:

public class MyT
{
    public int ID { get; set; }
    public MyT Set(string Line)
    {
        int x = 0;

        this.ID = Convert.ToInt32(Line);

        return this;
    }
}

public class MyList<T> : List<T> where T : MyT, new()
{
    internal T Add(T n)
    {
        Read();
        Add(n);
        return n;
    }
    internal MyList<T> Read()
    {
        Clear();
        StreamReader sr = new StreamReader(@"../../Files/" + GetType().Name + ".txt");
        while (!sr.EndOfStream)
            Add(new T().Set(sr.ReadLine())); //<----Here is my error!
        sr.Close();
        return this;
    }
}

public class Customer : MyT
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Item : MyT
{
    public int ID { get; set; }
    public string Category { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
}

public class MyClass
{
    MyList<Customer> Customers = new MyList<Customer>();
    MyList<Item> Items = new MyList<Item>();
}

在说“Add(new T()。Set(sr.ReadLine()));”的行上我得到“错误7,参数1:无法从'Simple_Reservation_System.MyT'转换为'T'”。有人可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:0)

您的类型MyList只能包含&#34; T&#34;类型的元素。 (在声明列表时指定)。您要添加的元素是&#34; MyT&#34;类型,无法下载到&#34; T&#34;。

考虑使用另一个MyT MyOtherT子类型声明MyList的情况。无法将MyT转换为MyOtherT。

答案 1 :(得分:0)

您的Add参数采用泛型类型T.您的Set方法返回一个具体的类MyT。它不等于T.事实上,即使你这样称呼:

添加(新MyT())

它将返回错误。

我还想补充说,只有当你在MyList类中时才会出错。如果你从另一个类调用相同的方法,它将起作用。

答案 2 :(得分:0)

因为您的类型MyT与通用参数T不同。当您编写此new T()时,您创建了一个必须从T继承的MyT类型的实例,但这不一定是MyT的类型。看看这个例子,看看我的意思:

public class MyT1 : MyT
{

}
//You list can contains only type of MyT1
var myList = new MyList<MyT1>();

var myT1 = new MyT1();
//And you try to add the type MyT to this list.
MyT myT = myT1.Set("someValue");
//And here you get the error, because MyT is not the same that MyT1.
myList.Add(myT);