在Dart中,语法上很好地将dynamic强制转换为给定类型或返回null?

在Dart中,语法上很好地将dynamic强制转换为给定类型或返回null?,dart,Dart,我有一个动态x,如果x是T,我想将x分配给ts,否则将null分配给s。具体地说,我希望避免必须键入x两次,并避免创建临时文件。(例如,我不想反复编写String s=map['key']是String吗?map['key']]:null;,因为我会有很多这样的表达式。)我不希望有任何运行时错误的可能性 以下工作: class Cast<T> { T f(x) { if (x is T) { return x; } else { retur

我有一个
动态x
,如果
x是T
,我想将
x
分配给
ts
,否则将
null
分配给
s
。具体地说,我希望避免必须键入
x
两次,并避免创建临时文件。(例如,我不想反复编写
String s=map['key']是String吗?map['key']]:null;
,因为我会有很多这样的表达式。)我不希望有任何运行时错误的可能性

以下工作:

class Cast<T> {
  T f(x) {
    if (x is T) {
      return x;
    } else {
      return null;
    }
  }
}

// ...

dynamic x = something();
String s = Cast<String>().f(x);
类转换{
tf(x){
if(x是T){
返回x;
}否则{
返回null;
}
}
}
// ...
动态x=某物();
字符串s=Cast().f(x);

有没有语法上更好的方法可以做到这一点?

Dart 2具有允许

T cast<T>(x) => x is T ? x : null;
T cast(x)=>x是T?x:空;
dynamic x=something();
字符串s=铸件(x);
你也可以使用

var /* or final */ s = cast<String>(x);
var/*或final*/s=cast(x);

并为
s

获取
String
推断。我使用以下实用程序函数,该函数允许可选的回退值和错误记录

T tryCast<T>(dynamic x, {T fallback}){
    try{
        return (x as T);
    }
    on CastError catch(e){
        print('CastError when trying to cast $x to $T!');
        return fallback;
    }
}

前两个帖子的组合,没有日志记录

未提供时,回退默认为null

T cast<T>(dynamic x, {T fallback}) => x is T ? x : fallback;
T cast(动态x,{T fallback})=>x是T吗?x:回退;

只需将用作关键字即可

final tweet = tweets[index] as Tweet;

我使用的是带有Dart空安全性的(Dart SDK>=2.12):

T?castOrNull(动态x)=>x是T?x:空;
T castOrFallback(动态x,T fallback)=>x是T?x:回退;

您还应该能够执行
字符串s=cast(x)
并获取类型参数,以从上下文推断出
cast
。此函数是否仍然退出?因为IDE似乎没有这个函数定义在哪里?@LeresAldtai在我的回答中;-)你需要自己定义它。回答得好,甘特!:)简单,可以在任何地方使用。这正是我想要的。谢谢,如果类型不匹配,是否返回null?
因为
是强制类型转换并且不安全。这不能在任何地方使用。如果类型不是给定类型,则不会返回null。相反,它抛出了一个错误。只有在确定类型的情况下,才应该使用它。
T cast<T>(dynamic x, {T fallback}) => x is T ? x : fallback;
final tweet = tweets[index] as Tweet;
T? castOrNull<T>(dynamic x) => x is T ? x : null;

T castOrFallback<T>(dynamic x, T fallback) => x is T ? x : fallback;