You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Jens Geyer (JIRA)" <ji...@apache.org> on 2019/01/22 00:40:00 UTC
[jira] [Commented] (THRIFT-1786) C# Union Typing
[ https://issues.apache.org/jira/browse/THRIFT-1786?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16748289#comment-16748289 ]
Jens Geyer commented on THRIFT-1786:
------------------------------------
For half an hour now I do wonder who wants to trade a class that contains data on read (via a questionable construction) that one has to cast from a naked {{object}} oimn order to put it to use, loosing the field ID information on the way, but instead creates strongly typed instances of sub-classes on write to get this as the only benefit:
{quote}
This gives us creation syntax of: {{var aunion = new AUnion.value(10);}}
{quote}
I mean ... honestly?!?
> C# Union Typing
> ---------------
>
> Key: THRIFT-1786
> URL: https://issues.apache.org/jira/browse/THRIFT-1786
> Project: Thrift
> Issue Type: New Feature
> Components: C# - Compiler
> Reporter: Carl Yeksigian
> Assignee: Carl Yeksigian
> Priority: Major
> Fix For: 0.9.1
>
> Attachments: 1786-make-fix.patch, 1786-v2.patch, 1786.patch
>
>
> Given the thrift IDL:
> {code}
> struct A {
> 0: i32 value
> }
> union AUnion {
> 0: A field1,
> 1: A field2,
> 2: i32 value
> }
> {code}
> We should generate a C# subclassing tree:
> {code}
> class A : TBase {
> int Value { get;set; }
> }
> abstract class AUnion : TBase {
> abstract object Data { get; }
> protected int field;
> abstract void WriteUnionField(TProtocol tprot);
> class field1 : AUnion {
> A _data;
> override object Data { get { return _data; } }
> public field1(A data) {
> this._data = data;
> this.field = 0;
> }
> }
> class field2 : AUnion {
> A _data;
> override object Data { get { return _data; } }
> public field2(A data) {
> this._data = data;
> this.field = 1;
> }
> }
> class value : AUnion {
> int _data;
> override object Data { get { return _data; } }
> public value(int data) {
> this._data = data;
> this.field = 2;
> }
> }
> }
> {code}
> This gives us creation syntax of:
> {code}
> var aunion = new AUnion.value(10);
> {code}
> This should be an optional parameter to the compiler since it is a breaking change to existing code.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)