如何使用 writeArray 方法將值寫入通用陣列 T[]?編譯器報錯,查看代碼中的注釋。
似乎通用陣列仍然是通用的 T。我認為通過指定 T 是 int 來初始化 intObj,物件中的每個占位符 T 現在都是資料型別 int?因此,對于發生錯誤的 this.array[i],我預計 T[] 會變為 int[]。先感謝您。
class GenericArray<T> {
Random rnd=new Random();
T[] array = new T[3];
public void writeArray() {
for (int i = 0; i<this.array.Length; i ) {
this.array[i]=rnd.Next(1,10); //Cannot implicitly convert type 'int' to 'T'
}
}
}
class Program {
public static void Main() {
GenericArray<int> intObj = new GenericArray<int>();
intObj.writeArray();
}
}
uj5u.com熱心網友回復:
將writeArray()方法放在GenericArray<T>類中沒有意義。如果您初始化一個物件,應該會發生什么GenericArray<string> intObj = new GenericArray<string>();
我建議將方法移出類或使其成為靜態,例如:
public static GenericArray<int> writeIntArray(){
Random rnd=new Random();
GenericArray<int> intObj = new GenericArray<int>();
for (int i = 0; i < intObj.array.Length; i ) {
intObj.array[i]=rnd.Next(1,10);
}
return intObj;
}
但是,在后一種情況下您將無法直接呼叫該方法,請參閱。另一個問題是您的 T 型別是否始終是數字型別?
uj5u.com熱心網友回復:
這里
this.array[i]=rnd.Next(1,10);
rand.Next()回傳一個整數;它始終回傳一個 int,無論您在自己的類中撰寫什么呼叫Next(). 左側運算元的型別始終為T。例如,如果您傳遞了 a string(如評論中所述)或比方說 a ,編譯器將如何知道該怎么做FileStream?當將 an 分配int為 a時,它如何猜測您期望什么樣的結果FileStream?
您可以做的是為您的泛型類提供一種從 int 獲取型別 T 的物件的WriteArray()方法,無論是在創建時還是在方法中:
class GenericArray<T>
{
Random rnd = new Random();
T[] array = new T[3];
public void WriteArray(Func<int, T> FuncToGetTFromInt)
{
for (int i = 0; i<this.array.Length; i )
{
this.array[i] = FuncToGetTFromInt(rnd.Next(1,10));
}
}
}
你會這樣使用它:
Func<int, string> FuncToGetStringFromInt = (value) =>
{
return $"This int's value was {value.ToString()}";
};
intObj.writeArray(FuncToGetStringFromInt);
或者(最好)你提供整個函式,給出 T 型別的隨機物件:
public void writeRandomArray(Func<T> FuncToGetRandomT)
{
for (int i = 0; i<this.array.Length; i )
{
this.array[i] = FuncToGetRandomT();
}
}
并像這樣使用它:
Random rnd = new Random();
GenericArray<string> aStr = new GenericArray<string>();
Func<string> FuncToGetRandomString = () => {return $"Hello world {rnd.Next()}!";};
aStr.WriteRandomArray(FuncToGetRandomString);
GenericArray<int> aInt = new GenericArray<int>();
Func<int> FuncToGetRandomInt = () => {return rnd.Next();};
aInt.WriteRandomArray(FuncToGetRandomInt);
uj5u.com熱心網友回復:
泛型的類T必須能夠處理所有型別的T. 這意味著writeArray無論T指定什么,它都必須作業。當然,如果T不是數字資料型別,您的版本將不起作用,因為Random總是生成數字。因此是不允許的。
我們需要做的是重寫您的類,使其僅包含對所有T.
abstract class GenericArray<T>
{
protected T[] array = new T[3];
protected abstract T GenerateRandomValue();
public void WriteArray()
{
for (int i=0; i<this.array.Length; i )
{
this.array[i] = GenerateRandomValue();
}
}
}
這是有道理的,因為我們知道如何存盤 any 的陣列T(我們宣告它),并且我們知道如何遍歷 any 的陣列T(我們使用for),但我們不知道如何為 any 生成隨機值T(所以我們將其保留為abstract)。
當您需要包含特定于型別的邏輯時,您可以關閉該型別(從它繼承并宣告型別引數)并在那里提供實作。
class IntegerArray : GenericArray<int>
{
Random rnd = new Random();
protected override T GenerateRandomValue() => rnd.Next(1,10);
}
當然,您可以為其他型別執行此操作。這是一個字串。由于Random產生數字,我們需要使用不同的函式來獲取隨機字串。在這個例子中,我只使用了一個 GUID。
class StringArray : GenericArray<string>
{
protected override T GenerateRandomValue() => System.Guid.NewGuid.ToString();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346677.html
