让我说我有下一个课程课程:
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'的定义....
为什么?
谢谢!
答案 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