通用委托类型错误

时间:2016-04-05 17:49:27

标签: c# .net lambda delegates

让我说我有下一个课程课程:

class Course
    {
        internal Student myStudent { get; set; }
        internal string Name { get; set; }

        public override string ToString()
        {
            return string.Format("{0, -5} {1, -15} {2}", Name, myStudent.Name, string.Join(" ", myStudent.Grade));
        }
        internal class Student
        {
            internal string Name { get; set; }
            internal List<int?> Grade { get; set; }
        }
    }

我希望在泛型委托中使用主要用途,一次用于int,一次用于字符串:

SomeDelegate<string> d1 = new SomeDelegate<string>(course => course.Name);
SomeDelegate<int> d2 = new SomeDelegate<int>(course => (int)course.myStudent.Grade.DefaultIfEmpty(null).Average());

通用代表是:

delegate T SomeDelegate<T>(T param);

但我得到错误。

  

字符串不包含'Name'的定义....

为什么?

谢谢!

2 个答案:

答案 0 :(得分:4)

您的委托定义要求输入参数的类型和输出相同。在您的情况下,您尝试传入一个具有Name属性的对象并返回一个字符串,这违反了您的代理人的签名。

将您的代表更改为

delegate TOut SomeDelegate<TIn, TOut>(Tin param);

或使用内置的Func delegates

答案 1 :(得分:1)

你可能需要一对代表。这里的问题是我们有两个你想要使用的用例:

delegate T SomeDelegate<T>(T param);

上面是一个简单的委托,这意味着你传入的是T,而不是一个返回T的lambda。在这种情况下,您可以这样称呼它:new SomeDelegate<string>(course.Name)

delegate T SomeDelegate<T>(Func<T> param);

上面是一个稍微复杂的委托,这意味着你传入的函数在完成时会计算为T。 Lambdas非常擅长处理这个问题。在这种情况下,您可以这样称呼它:new SomeDelegate<string>(course => course.Name)

您可以在此处阅读有关lambdas,表达式等的更多信息:https://msdn.microsoft.com/en-us/library/bb397687.aspx