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

Add パラメーターはジェネリック型 T を受け取ります。Set メソッドは具象クラス MyT を返します。これは T と等しくありません。実際、これを呼び出しても、次のようになります。

Add(新しい MyT())

エラーが返されます。

また、これは MyList クラス内にいる間だけのエラーであることも付け加えておきます。別のクラスから同じメソッドを呼び出すと、機能します。

于 2013-05-10T07:42:50.227 に答える
0

あなたの型MyTはジェネリック パラメータと同じではないためTです。これを記述すると、から継承する必要がnew T()あるタイプのインスタンスが作成されますが、必ずしも のタイプであるとは限りません。この例を見て、私が何を意味するかを確認してください。TMyTMyT

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」にダウンキャストできません。

MyList が MyT の別のサブタイプ MyOtherT で宣言されている場合を考えてみましょう。MyT を MyOtherT にキャストすることはできません。

于 2013-05-10T07:38:59.677 に答える