標籤:

如何在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& TransposeTimes(Vector& B)
{
if (B.Count != this.RowCount)
{
throw new ArgumentException("Matrix inner dimensions must agree.");
}
Vector& X =new Vector&(this.ColumnCount);
// 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; }

2)靜態類MatrixExtension,裡邊對double[,]類型做擴展。

//矩陣與向量相乘
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; }

不論哪種方式,在運算函數開始的部分都要判斷維度是否匹配。不匹配throw ArgumentException


協變,逆變


函數體里先判斷a的列和b的行數是不是相等,定義方法直接 int[,]就行了吧


推薦閱讀:

如何實現 Call / CC 或者陰陽謎題(Yin Yang Puzzle)?
是否Future/Promise模式 能實現的FRP都能更好的實現?
如何將MATLAB轉化為C#?
如何看待2017的 The .NET Language Strategy 去掉了C++/CLI支持?
什麼情況下使用異常處理?

TAG:編程 | C# | CC |