C#は三項演算子で暗黙の型変換してくれない
C#入門数日目なので温かい目で・・・:pray:
状況によって Container
または Text
を表示する、みたいなコードを書く際、
Flutterだと
Column(children: <Widget>[flag ? Container() : Text('some text')])
ができるけど、 C#は
new Column(children: new List<Widget> { flag ? new Container() as Widget : new Text("some text") })
と、少なくともどちらか一方でも明示的にアップキャストしてあげないとならない。
勝手に Widget
として解釈してくれない。
一方で
new Column(children: new List<Widget> { new Container(), new Text("some text") })
みたいにListの要素が型引数のサブクラスの場合は合法なので、
C#の型システムさんか三項演算子さんにはもう少し頑張っていただきたいと思いました
この挙動でちょっとこまったのは、
new RaisedButton( color: Palette.Primal, onPressed: isLoginPending ? null : () => { loginAttempt(this.email, this.password); })
みたいなボタンの実装。
FlutterやUIWidgetsでは、ボタンがenabledかどうかはコールバックがnullかどうかで判定されるのですが、
C#だと null
と () => {}
の型が一致していなければならないらしく、nullを何かしらの型にキャストしてあげなければなりません。
new RaisedButton( color: Palette.Primal, onPressed: isLoginPending ? null as VoidCallback : () => { loginAttempt(this.email, this.password); })
正解はこれでした。 VoidCallback
にキャスト。