Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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# 3.0 理解函数<;T、 TResult>;C#_C# 3.0 - Fatal编程技术网

C# 3.0 理解函数<;T、 TResult>;C#

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();

我正在尝试重构一些代码以使用Func 我创建了一个示例,试图了解它是如何工作的,但我发现编译错误。在下面的示例中,当我试图访问参数属性或返回编译器抱怨的返回值时

请澄清

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,感谢您的澄清,所有的输入参数类都来自一个公共接口。不幸的是,其中一个引用字段是在单个类级别定义的,而不是在接口级别定义的(例如)