如何在C#中實現返回類型由參數決定的函數?
大概是想實現如上圖這樣的一個函數。兩個問題:1.有沒有辦法使返回的類型由輸入的參數類型決定?像這種有無數種形狀的矩陣不可能一個一個實現重載,那矩陣乘法的函數是怎麼做的?
2.如圖所示的n的位置,一個函數可以接受一個類型不定的參數嗎?假如僅僅是需要接受一個int[n](n在編譯前無法確定)類型的參數可以做到嗎?———————————————————————————————————————————謝謝各位了,我老是想著不讓錯誤規格的參數傳進來,就想偏了,確實應該在函數里做檢查拋出異常。我還是太年輕了,有時候天真,需要學習一個。
C#沒有固定長度的數組類型,你只能寫
int[,] JuZhenChengFa(int[,] diYiGeJuZhen, int[,] diErGeJuZhen)
{
// Ran hou zai zhe li jian cha diYiGeJuZhen he diErGeJuZhen de chang du you mei you wen ti。
}
C# 沒有 dependent type 所以做不到
為什麼要用int[,]?為什麼不給包裝成一個類呢?
public class Matrix
{
public static Matrix operator + (Matrix a, Matrix b)
{
...
}
}
如果你一定要用int[,]做輸入輸出的話,可以這樣
public class Matrix
{
public Matrix(int[,] input) { ... }
public int[,] ToIntArray() { ... }
}
當然最後的做法是可以用dynamic或者反射,但我覺得以你這個用例毫無必要
你這又不是動態類型,只是想固定數組長度罷了。
傳入參數做檢查,不符合你的要求就拋異常,返回int[,]類型,我沒看出會有任何問題,因為返回的長度調用方給出的參數決定的,調用方自然可以直接知道返回的長度。不要總想著怎麼讓工具滿足你的想法,而是要用工具去實現你的想法。題主是想用c#做矩陣運算吧,有兩種方式。
1)實現Matrix和Vector,然後運算時,函數參數可以用這兩個類型。
//矩陣與向量相乘
public Vector&
{
if (B.Count != this.RowCount)
{
throw new ArgumentException("Matrix inner dimensions must agree.");
}
Vector&
// multiply it with each row from A
for (int i = 0; i &< this.ColumnCount; i++)
{
double s = 0;
for (int k = 0; k &< this.RowCount; k++)
{
s += this[k, i] * B[k];
}
X[i] = s;
}
return X;
}
//矩陣與向量相乘
public static double[] TransposeTimes(this double[,] me, double[] B)
{
int rowCount = me.GetLength(0);
int columnCount = me.GetLength(1);
if (B.Length != rowCount)
{
throw new ArgumentException("Matrix inner dimensions must agree.");
}
double[] X = new double[columnCount];
// multiply it with each row from A
for (int i = 0; i &< columnCount; i++)
{
double s = 0;
for (int k = 0; k &< rowCount; k++)
{
s += me[k, i] * B[k];
}
X[i] = s;
}
return X;
}
協變,逆變
函數體里先判斷a的列和b的行數是不是相等,定義方法直接 int[,]就行了吧
推薦閱讀:
※如何實現 Call / CC 或者陰陽謎題(Yin Yang Puzzle)?
※是否Future/Promise模式 能實現的FRP都能更好的實現?
※如何將MATLAB轉化為C#?
※如何看待2017的 The .NET Language Strategy 去掉了C++/CLI支持?
※什麼情況下使用異常處理?