我知道这是一个老的问题,但我认为,这个问题也值得回答why,这是不可能做到的(没有使用各种简单的工作方式)。
在使用通用物时,从某种意义上来说,你是采用模板代码。 汇编者对您的法典使用一套更为严格的规则,因为它在汇编最后版本时也必须汇编成册。
因此,当你以通用语创建班级或方法时,必须将其汇编成任何可能的组合:,这些组合遵守你对通用参数的限制。
因此,我甚至进一步简化了你的法典,以显示所发生的情况:
我先宣布3个班级。 父母和两名子女:
public class Super { }
public class Child : Super { }
public class Sister : Super { }
然后,我宣布了一种通用的方法,在我尝试测试这种方法,然后将这种方法用于儿童类型:
public void InvalidMethod<T>(T input)
where T : Super
{
Child castedReference = null;
if (input is Child)
{
// This intuitively ought to be valid C#, but generates a compiletime error
castedReference = (Child)input;
}
// Do stuff...
}
这给你留下了与原始问题相同的错误,尽管在理论上,它看起来像坚实法典。 然而,实际发生的情况是,如果《法典》在任何法律文本的操作时间可以编纂,则汇编者就会进行检查。 这就是我所说的,即你正在使用模板,因为如果你把“修女”方法称作你的类型参数,你会这样做:
public void InvalidMethod(Sister input)
{
Child castedReference = null;
// Following if is never true
if (input is Child)
{
// Following statement is invalid C#
castedReference = (Child)input;
}
// Do stuff...
}
因此,我的猜测(我不知道,但如果我错过,请更正我),你在从事非专利工作时所作的这一限制是,因为你的守则不应中断,仅仅是因为你开始在另一个背景下提出,因此,他们不允许你像现在这样写法,尽管在编纂时可能没有任何无效的组合。
这有助于我理解为什么某些事情可以做,某些事情也无法做。 是的,你可以使用“作为”而不是打字,因为如果投稿无效,汇编者只能给你“null”,但如果有可能,可以明确分类编辑检查。 对于通用术语来说,确保它也能在运行时汇编。