0

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

这是我的代码:

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'”。有人可以帮我解决这个问题。

4

3 回答 3

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);
于 2013-05-10T07:43:43.970 回答
0

您的 MyList 类型只能包含“T”类型的元素(在声明列表时指定)。您尝试添加的元素是“MyT”类型,不能向下转换为“T”。

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

于 2013-05-10T07:38:59.677 回答
0

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

添加(新的 MyT())

它会返回一个错误。

我还想补充一点,只有当您在 MyList 类中时,这才是一个错误。如果您从不同的类调用相同的方法,它将起作用。

于 2013-05-10T07:42:50.227 回答