C# 3.0 理解函数<;T、 TResult>;C#
我正在尝试重构一些代码以使用Func 我创建了一个示例,试图了解它是如何工作的,但我发现编译错误。在下面的示例中,当我试图访问参数属性或返回编译器抱怨的返回值时 请澄清C# 3.0 理解函数<;T、 TResult>;C#,c#-3.0,C# 3.0,我正在尝试重构一些代码以使用Func 我创建了一个示例,试图了解它是如何工作的,但我发现编译错误。在下面的示例中,当我试图访问参数属性或返回编译器抱怨的返回值时 请澄清 using System; namespace chsarp { class Program { static void Main(string[] args) { ParamInput input = new ParamInput();
using System;
namespace chsarp
{
class Program
{
static void Main(string[] args)
{
ParamInput input = new ParamInput();
input.ReservationID = 10;
Test testMethod = new Test();
Func<ParamInput, ReservationResult> methodToInvoke = testMethod.GetStatus;
ReservationResult result = TestFn(methodToInvoke, input);
}
static Result TestFn<Param, Result>(Func<Param, Result> methodToInvoke, Param parameter) where Result : new()
{
Result result = new Result();
try
{
result = methodToInvoke(parameter);
}
catch (Exception exception)
{
result.status = string.Format("Error-{0} during reserving {1}",
parameter.ReservationID,
exception.Message);
}
return result;
}
}
class Test
{
public ReservationResult GetStatus(ParamInput msg)
{
ReservationResult result = new ReservationResult();
result.status = string.Format("The ReservationID-{0}", msg.ReservationID);
return result;
}
}
class ParamInput
{
public int ReservationID { get; set; }
}
class ReservationResult
{
public string status { get; set; }
}
}
使用系统;
命名空间chsarp
{
班级计划
{
静态void Main(字符串[]参数)
{
ParamInput=新的ParamInput();
input.ReservationID=10;
测试方法=新测试();
Func methodoinvoke=testMethod.GetStatus;
ReservationResult=TestFn(方法调用,输入);
}
静态结果TestFn(Func methodoinvoke,Param参数),其中结果:new()
{
结果=新结果();
尝试
{
结果=方法激活(参数);
}
捕获(异常)
{
result.status=string.Format(“保留{1}期间出现错误-{0}”,
parameter.ReservationID,
例外情况(信息);
}
返回结果;
}
}
课堂测试
{
public ReservationResult GetStatus(参数输入消息)
{
ReservationResult=新的ReservationResult();
result.status=string.Format(“ReservationID-{0}”,msg.ReservationID);
返回结果;
}
}
类参数输入
{
public int ReservationID{get;set;}
}
类保留结果
{
公共字符串状态{get;set;}
}
}
注释编译错误:
error CS1061: 'Result' does not contain a definition for 'status'
error CS1061: 'Param' does not contain a definition for 'ReservationID'
只有在编译器知道泛型类型的成员时,使用泛型类型参数的代码才能编译。它不知道结果类型参数有一个“status”成员。如果调用TestFn()
,则肯定不会发生这种情况
您将需要使用约束来实现此操作。您已经这样做了,但是new()不够强大。类似于“where Result:IResult”的内容,例如,其中IResult是具有status属性的接口类型。或者一个基类。编译器现在可以100%确保任何允许的泛型方法的具体实例都将执行,而不会导致运行时错误。因为它只能在使用具有“status”属性的类型调用时进行编译
所有这些都适用于Param类型参数。当你这样做的时候,通用方法的有用性很快就会消失,它不是正确的用法。除非您可以利用IResult,就像您可以使用IEnumerable一样。带注释的编译错误:
error CS1061: 'Result' does not contain a definition for 'status'
error CS1061: 'Param' does not contain a definition for 'ReservationID'
只有在编译器知道泛型类型的成员时,使用泛型类型参数的代码才能编译。它不知道结果类型参数有一个“status”成员。如果调用TestFn()
,则肯定不会发生这种情况
您将需要使用约束来实现此操作。您已经这样做了,但是new()不够强大。类似于“where Result:IResult”的内容,例如,其中IResult是具有status属性的接口类型。或者一个基类。编译器现在可以100%确保任何允许的泛型方法的具体实例都将执行,而不会导致运行时错误。因为它只能在使用具有“status”属性的类型调用时进行编译
所有这些都适用于Param类型参数。当你这样做的时候,通用方法的有用性很快就会消失,它不是正确的用法。除非您可以利用IResult,就像您可以使用IEnumerable一样。编译
你应该在问题中说明你的目标
有关可能帮助您理解错误的详细信息,请参阅Hans的答案
你的问题是,你说函数应该得到一个可实例化的结果,但你不是说它必须有一个名为“status”的属性
名称空间chsarp
{
班级计划
{
静态void Main(字符串[]参数)
{
Func m=Test.GetStatus;
var t=TestFn(m,10);
}
静态字符串测试fn(函数m,TParam p)
{
尝试{返回m(p);}
捕获(异常)
{
返回string.Format(“保留\“{0}\”失败异常:{1}”,p,异常);
}
}
}
静态类测试
{
公共静态字符串GetStatus(int inp)
{
返回string.Format(“ReservationID-{0}”,inp);
}
}
}
编译
你应该在问题中说明你的目标
有关可能帮助您理解错误的详细信息,请参阅Hans的答案
你的问题是,你说函数应该得到一个可实例化的结果,但你不是说它必须有一个名为“status”的属性
名称空间chsarp
{
班级计划
{
静态void Main(字符串[]参数)
{
Func m=Test.GetStatus;
var t=TestFn(m,10);
}
静态字符串测试fn(函数m,TParam p)
{
尝试{返回m(p);}
捕获(异常)
{
返回string.Format(“保留\“{0}\”失败异常:{1}”,p,异常);
}
}
}
静态类测试
{
公共静态字符串GetStatus(int inp)
{
返回string.Format(“ReservationID-{0}”,inp);
}
}
}
您遇到了什么编译器错误?因为英语不好,问题不好而投反对票。您遇到了什么编译器错误?因为英语不好,问题不好而投反对票。Hans,感谢您的澄清,所有的输入参数类都来自一个公共接口。不幸的是,其中一个引用字段是在单个类级别定义的,而不是在接口级别定义的(例如)