Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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# 是否可以重载Func<;T、 TResult>;和Func<;T1、T2、TResult>;有相同的名字吗?_C#_Delegates_Overloading_Func - Fatal编程技术网

C# 是否可以重载Func<;T、 TResult>;和Func<;T1、T2、TResult>;有相同的名字吗?

C# 是否可以重载Func<;T、 TResult>;和Func<;T1、T2、TResult>;有相同的名字吗?,c#,delegates,overloading,func,C#,Delegates,Overloading,Func,首先,我知道我可以定义两个重载的助手方法来做我需要的事情(或者甚至只定义两个具有不同名称的func),但是它们只被一个公共方法使用,所以我正在探索通过使用相同名称来定义两个也重载的本地func的方法。例如: string DisplayValue(int value) { return DisplayValue(value, val => val.ToString()); } string DisplayValue(int value, Func<int, string> f

首先,我知道我可以定义两个重载的助手方法来做我需要的事情(或者甚至只定义两个具有不同名称的func),但是它们只被一个公共方法使用,所以我正在探索通过使用相同名称来定义两个也重载的本地func的方法。例如:

string DisplayValue(int value)
{ return DisplayValue(value, val => val.ToString()); }

string DisplayValue(int value, Func<int, string> formatter)
{ return (value < 0) ? "N/A" : formatter(value); }
字符串显示值(int值)
{返回DisplayValue(value,val=>val.ToString());}
字符串显示值(int值,Func格式化程序)
{return(value<0)-“N/A”:格式化程序(value);}
我需要在我的公共方法中多次调用一个或另一个版本来定制特殊值的格式,所以我想我可以将上面的内容“翻译”成如下内容:

Func<int, Func<int, string>, string> displayValue =
    (value, formatter) => (value < 0) ? "N/A" : formatter(value);

Func<int, string> displayValue =
    value => displayValue(value, val => val.ToString());
delegate string DisplayDelegate(int value, params Func<int, string>[] formatters);
Func显示值=
(值,格式化程序)=>(值<0)?“不适用”:格式化程序(值);
Func显示值=
value=>displayValue(value,val=>val.ToString());
即使在我输入时,我知道我不能声明两个具有相同名称的委托标识符,即使它们是不同的类型。这比我死心塌地地使用Funcs实现重载更具学术性,但我想他们不可能做到所有事情,对吧

我猜你也不能这样做:

Func<string, params object[], string> formatArgs =
    (format, args) => string.Format(format, args);
Func formatArgs=
(format,args)=>string.format(format,args);

不,不能重载变量。这就是你想要做的

从用例中可以看出:

 DisplaywWithoutFormatter(displayValue);
 DisplaywWithFormatter(displayValue);

由于没有涉及任何参数,编译器无法可靠地区分这两个参数

> P>我认为你可以通过创建一个带有过载的<代码>操作程序()/<代码>来实现C++中的类似操作。但是在C#中,您只有委托,并且不能重载它们。

您可以通过为格式化程序声明一个带有

delegate string DisplayValue(int value, Func<int, string> formatter = null);

static void Main(string[] args)
{
    DisplayValue displayValue = (value, formatter) =>
        formatter == null ?
            value.ToString() :
        value < 0 ?
            "N/A" :
            formatter(value);

    string s1 = displayValue(33);
    string s2 = displayValue(33, i => i.ToString("D4"));

    // s1: "33"
    // s2: "0033"
}
委托字符串DisplayValue(int-value,Func-formatter=null);
静态void Main(字符串[]参数)
{
DisplayValue DisplayValue=(值,格式化程序)=>
格式化程序==null?
value.ToString():
值<0?
“不适用”:
格式化程序(值);
字符串s1=显示值(33);
字符串s2=显示值(33,i=>i.ToString(“D4”);
//s1:“33”
//s2:“0033”
}

您可以使用String.Format()函数显式定义案例的委托类型:

delegate string FormatDelegate(string formatString, params object[] @params);
对于带有可选参数的.Net Framework,您可以使用@Douglas提供的答案

但如果使用.Net Framework 3.5(无可选参数),则可以如下定义DisplayValue委托:

Func<int, Func<int, string>, string> displayValue =
    (value, formatter) => (value < 0) ? "N/A" : formatter(value);

Func<int, string> displayValue =
    value => displayValue(value, val => val.ToString());
delegate string DisplayDelegate(int value, params Func<int, string>[] formatters);
委托字符串DisplayDelegate(int值,params Func[]格式化程序);
以下是使用学员的示例:

delegate string DisplayDelegate(int value, params Func<int, string>[] formatters);

delegate string FormatDelegate(string formatString, params object[] @params);

static void Main()
{
    FormatDelegate formatDelegate = (format, args) => string.Format(format, args);

    Console.WriteLine(formatDelegate("String with params: {0} {1}", 1, "something")); 
    //Output: "String with params: 1 something"

    Console.WriteLine(formatDelegate("String without params"));  
    //Output: "String without params"

    DisplayDelegate displayValue  = 
        (value, formatter) =>
            formatter.Length == 0 
                ? value.ToString() 
                : value < 0 
                    ? "N/A" 
                    : formatter[0](value);

    Console.WriteLine(displayValue(33));                         // "33"
    Console.WriteLine(displayValue(33, v => v.ToString("D4")));  // "0033"
    Console.WriteLine(displayValue(-33));                        // "-33"  
    Console.WriteLine(displayValue(-33, v => v.ToString("D4"))); // "N/A"
}
委托字符串DisplayDelegate(int值,params Func[]格式化程序);
委托字符串格式委托(字符串格式字符串,参数对象[]@params);
静态void Main()
{
FormatDelegate FormatDelegate=(格式,参数)=>string.format(格式,参数);
WriteLine(formatDelegate(“带参数的字符串:{0}{1}”,1,“something”);
//输出:“参数为1的字符串”
WriteLine(formatDelegate(“不带参数的字符串”);
//输出:“不带参数的字符串”
DisplayDelegate displayValue=
(值,格式化程序)=>
格式化程序。长度==0
?value.ToString()
:值<0
“不适用”
:格式化程序[0](值);
Console.WriteLine(显示值(33));/“33”
Console.WriteLine(displayValue(33,v=>v.ToString(“D4”));/“0033”
Console.WriteLine(显示值(-33));/“-33”
Console.WriteLine(displayValue(-33,v=>v.ToString(“D4”));/“不适用”
}

您是否尝试过使用
params
arg创建自定义委托<代码>公共委托字符串字符串格式化程序(字符串格式,参数字符串[]args)