【发布时间】:2010-02-25 21:06:43
【问题描述】:
我有一些示例数据:
public struct Task
{
public int INT;
public string STRING;
public DateTime? NULLABLEDATETIME;
}
以及使用它的函数:
public KeyValuePair<Expression<Func<Task, object>>, object> Marry(Expression<Func<Task, object>> key, object value)
{
return new KeyValuePair<Expression<Func<Task, object>>, object>(key, value);
}
这里是函数调用的例子:
Marry(t => t.INT, 1984);
Marry(t => t.NULLABLEDATETIME, DateTime.Now);
Marry(t => t.STRING, "SomeSting");
此代码有效,没有问题。不幸的是,我们也可以调用如下函数,因为 String 和 int 都是从对象类继承的:
Marry(t => t.INT, "SomeSting");
我想说编译器,第一个和第二个参数具有相同的数据类型:int -> int,string -> string,DateTime? -> DateTime?,并在编译期间检查它。我试过这个:
public KeyValuePair<Expression<Func<Task, T1>>, T2> Marry<T1, T2>(Expression<Func<Task, T1>> key, T2 value)
where T2 : T1
{
return new KeyValuePair<Expression<Func<Task, T1>>, T2>(key, value);
}
这几乎可以工作,如果我尝试输入像这样的错误数据Marry(t => t.INT, "SomeSting");,编译器会报告错误:
类型“string”不能用作泛型类型或方法“Task.Marry(System.Linq.Expressions.Expression>, T2)”中的类型参数“T2”。没有从 'string' 到 'int' 的隐式引用转换。
但此解决方案不适用于null。当我调用Marry(t => t.NULLABLEDATETIME, null); 时,编译器会说:
方法“Marry(System.Linq.Expressions.Expression>, T2)”的类型参数无法从用法中推断出来。尝试明确指定类型参数。
为什么?我已经知道数据类型:DateTime?。我不想明确调用Marry<DateTime?>(t => t.NULLABLEDATETIME, null);。我该怎么做 - 或者有其他方法可以在编译期间检查某些函数参数类型?
【问题讨论】:
标签: c# generics parameters types constraints