C# 如何为T[],T[]编写重载泛型扩展方法而不产生歧义?
我想写一些扩展方法,将向量和矩阵转换成字符串。我是这样做的 用于向量C# 如何为T[],T[]编写重载泛型扩展方法而不产生歧义?,c#,generics,extension-methods,default-parameters,C#,Generics,Extension Methods,Default Parameters,我想写一些扩展方法,将向量和矩阵转换成字符串。我是这样做的 用于向量 public static string GetString<T>(this T[] SourceMatrix, string ColumnDelimiter = " ") { try { string result = ""; for (int i = 0; i < SourceMatrix.GetLength(0); i++) res
public static string GetString<T>(this T[] SourceMatrix, string ColumnDelimiter = " ")
{
try
{
string result = "";
for (int i = 0; i < SourceMatrix.GetLength(0); i++)
result += SourceMatrix[i] + ColumnDelimiter;
return result;
}
catch (Exception ee) { return null; }
}
Error 5 The call is ambiguous between the following methods or properties:
'MatrixMathLib.MatrixMath.GetString<double[]>(double[][], string)' and
'MatrixMathLib.MatrixMath.GetString<double>(double[][], string, string)'
公共静态字符串GetString(此T[]SourceMatrix,字符串ColumnDelimiter=”“)
{
尝试
{
字符串结果=”;
对于(int i=0;i
用于矩阵
public static string GetString<T>(this T[][] SourceMatrix, string ColumnDelimiter = " ", string RowDelimiter = "\n")
{
try
{
string result = "";
for (int i = 0; i < SourceMatrix.GetLength(0); i++)
{
for (int j = 0; j < SourceMatrix[i].GetLength(0); j++)
result += SourceMatrix[i][j] + "" + ColumnDelimiter;
result += "" + RowDelimiter;
}
return result;
}
catch (Exception ee) { return null; }
}
公共静态字符串GetString(此T[]SourceMatrix,string ColumnDelimiter=“”,string RowDelimiter=“\n”)
{
尝试
{
字符串结果=”;
对于(int i=0;i
现在我使用下面的代码,这会导致歧义
List<double[]> Patterns= GetPatterns();
Patterns.ToArray().GetString();
List Patterns=GetPatterns();
Patterns.ToArray().GetString();
错误
public static string GetString<T>(this T[] SourceMatrix, string ColumnDelimiter = " ")
{
try
{
string result = "";
for (int i = 0; i < SourceMatrix.GetLength(0); i++)
result += SourceMatrix[i] + ColumnDelimiter;
return result;
}
catch (Exception ee) { return null; }
}
Error 5 The call is ambiguous between the following methods or properties:
'MatrixMathLib.MatrixMath.GetString<double[]>(double[][], string)' and
'MatrixMathLib.MatrixMath.GetString<double>(double[][], string, string)'
错误5以下方法或属性之间的调用不明确:
'MatrixMathLib.MatrixMath.GetString(双[],字符串)'
'MatrixMathLib.MatrixMath.GetString(双[],字符串,字符串)'
有人能建议我正确地编写这些扩展方法吗
提前感谢。您可以省略默认值或在函数调用中声明T的类型您的方法没有问题。编译器不能在它们之间进行选择 正如您在错误消息中看到的,编译器可以假定
T
为double[]
并匹配第一个方法,或者double
并匹配第二个方法。这将通过明确提及您要使用的方法来解决:
Patterns.ToArray().GetString<double>();
Patterns.ToArray().GetString();
编译器无法判断是否要调用GetString
或GetString
,因为这两种方法都适合调用
解决这个问题的最简单方法是简单地更改其中一个名称(即GetArrayString
)。更好的解决方案是只有一种方法可以解决这两种情况,如下所示:
public static string Join<T>(this T[] sourceMatrix, string columnDelimiter = " ", string rowDelimiter = "\n")
{
if (sourceMatrix.Length == 0)
{
return string.Empty;
}
if (sourceMatrix[0] as Array == null)
{
return string.Join(columnDelimiter, sourceMatrix);
}
var rows = new List<string>();
foreach (T item in sourceMatrix)
{
var array = item as Array;
var row = "";
for (int j = 0; j < array.GetLength(0); j++)
row += array.GetValue(j) + columnDelimiter;
rows.Add(row);
}
return string.Join(rowDelimiter, rows);
}
输出:
1 2 3
1 2 3
1 2 4
注意:这只解决1-2维的问题,但很容易推广到n维。只是一个小建议,将数组转换为字符串的静态字符串方法(
string.Join(,)
)将矩阵存储在锯齿状数组中是很奇怪的。。。为什么不使用多维方法?@BadikAliString.Join
不是扩展方法,它是String
类的静态方法。@leppie正如我在代码中提到的,实际上我使用的是List
和ToArray()
扩展,它将返回double[]
,在我的问题中,我需要交错数组,因为每行(模式)可以有不同数量的值。也许会晚一点?来吧,米奇。迟到的回答没有代表性,所以这只是一件好事@米奇麦:(编辑:这是你现在删除的评论。)嗯,事实上,不像你,他回答了问题,他说编译器不能区分它们。你只是回答了一个完全不同的问题,从来没有说明是否有可能完成所要求的任务,让任务悬而未决+1给Alireza。@MitchWheat:也许你应该多给一点。@MitchWheat如果我删除我的答案会有帮助吗?无论如何,几次重复是不值得的。