Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为T[],T[]编写重载泛型扩展方法而不产生歧义?_C#_Generics_Extension Methods_Default Parameters - Fatal编程技术网

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(,)
)将矩阵存储在锯齿状数组中是很奇怪的。。。为什么不使用多维方法?@BadikAli
String.Join
不是扩展方法,它是
String
类的静态方法。@leppie正如我在代码中提到的,实际上我使用的是
List
ToArray()
扩展,它将返回
double[]
,在我的问题中,我需要交错数组,因为每行(模式)可以有不同数量的值。也许会晚一点?来吧,米奇。迟到的回答没有代表性,所以这只是一件好事@米奇麦:(编辑:这是你现在删除的评论。)嗯,事实上,不像你,他回答了问题,他说编译器不能区分它们。你只是回答了一个完全不同的问题,从来没有说明是否有可能完成所要求的任务,让任务悬而未决+1给Alireza。@MitchWheat:也许你应该多给一点。@MitchWheat如果我删除我的答案会有帮助吗?无论如何,几次重复是不值得的。