C# 为什么可以';我不能将Linq的结果转换为SQL吗?

C# 为什么可以';我不能将Linq的结果转换为SQL吗?,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我有一个Linq到SQL数据上下文,其中包含SQL函数。虽然retrieve对象很好,但我想向该对象添加一个属性,同时缩短对象名称。因此,我制作了一个对象提醒器,它使用我想要的属性从Linq到SQL对象FNRTU_提醒器Bytaskresult继承 public class Reminder : fnRTHU_ReminderByTaskResult { public string MyProperty {get;set;} } 然后,当函数绑定到列表时,我尝试在aspx文件中执行以下

我有一个Linq到SQL数据上下文,其中包含SQL函数。虽然retrieve对象很好,但我想向该对象添加一个属性,同时缩短对象名称。因此,我制作了一个对象提醒器,它使用我想要的属性从Linq到SQL对象FNRTU_提醒器Bytaskresult继承

public class Reminder : fnRTHU_ReminderByTaskResult
{
    public string MyProperty {get;set;}
}
然后,当函数绑定到列表时,我尝试在aspx文件中执行以下操作:

<asp:Literal runat="server" Text='<%# ((Reminder)DataBinder.Container).MyProperty %>' />


其中,DataBinder.Container的类型为FNRTU(U)ReminderByTaskResult。这将导致InvalidCastException,无法将对象类型FNRTU_ReminderByTaskResult强制转换为类型Reminder。我不明白,因为我继承了从中进行强制转换的类型。

不幸的是,您正在尝试向下转换C#不支持的类型。您无法从父类型强制转换为子类型。

问题在于您试图将基类的实例转换为子类。这是无效的,因为子项从基继承。不能保证从基层到儿童的案例都能奏效(这被称为下流社会)。向上投射(从儿童到基础)是安全的


但是,如果容器属性是提醒的实例,这将起作用。在本例中,它似乎不是。

因为Linq to Sql函数返回该基类,所以您的对象从来不是派生类的对象。因此,当试图放弃时,它不能这样做。但是,您可以在类中提供隐式和显式强制转换实现,以允许此强制转换工作


只要底层对象是子对象(或子对象的子对象),您肯定可以将父引用向下转换为子引用。这与我所说的无关。我说了parent“type”not parent“reference”。@Andrew,你的回答说C#不支持向下转换,它支持向下转换。得到了两个好答案,但我选择的一个作为可能的解决方案来实现,希望你不介意投票支持你的答案。实现了操作符的解决方案:公共静态隐式操作符提醒(FNRTU_提醒YTASKRESULT结果)