如何使用泛型类型参数和“as”运算符强制转换变量

本文关键字:运算符 转换 变量 as 何使用 泛型类型参数 | 更新日期: 2023-09-27 18:33:42

我有以下通用静态类,它正在Fluent API中使用。它接受一个输入参数,并返回一个包装类,其中包含对泛型类型的参数强制转换。

public static Foo<TOut> InputAs<TOut>(object parameter) {
    var castParameter = parameter as TOut;
    if(castParameter == null) {
         throw new Exception("Invalid cast");
    }
    return new Foo<TOut>(castParameter);
}

问题是castParameter == null检查总是返回 null . 使用 TOut 泛型参数作为新类型强制转换对象的正确方法是什么?

如何使用泛型类型参数和“as”运算符强制转换变量

好吧,如果parameter as TOut返回null,则parameter的运行时类型不是TOut

不要忘记,运算符

解析是在编译时完成的,因此,如果定义了强制转换运算符,则不会在此处调用它们。如果你确实需要它,你可以使用dynamic

public static Foo<TOut> InputAs<TOut>(dynamic parameter) 
{    
    return new Foo<TOut>((TOut)parameter);
}

这将允许运行时运算符解析,并将调用转换运算符(如果可用)。例如,它将允许您通过 long ,同时期待int .

但是,您可能想找到一种不同的方法来尝试执行操作; dynamic可能非常有用,但它也会使调试变得更加困难,并且您几乎会丢失所有编译时警告和错误,这些警告和错误可以帮助您在问题发生之前识别问题。