Buat objek yang statusnya berubah pada tugas

31

Saya merasa sangat aneh bahwa ini dimungkinkan di Ruby (saya tidak akan langsung mengatakan caranya):

obj = #code redacted

print obj.state # Some value.

LValue = obj

print obj.state # Different value!

Tantangan Anda adalah membuat kode secara kasar dari formulir ini. Buat objek dan tetapkan ke variabel. Seharusnya memiliki beberapa atribut yang didefinisikan (atau deterministik, metode idempoten) seperti di stateatas, yang berubah setelah objek ditugaskan ke pengidentifikasi baru (di LValueatas), bahkan jika Anda masih menggunakan pengidentifikasi lama (di objatas) untuk merujuk padanya.

Edit untuk penekanan : stateatau yang setara harus idempoten, jadi membuat accessor yang mengubah nilai, atau karena alasan lain mengembalikan hasil yang berbeda ketika dipanggil beberapa kali berturut-turut, bukan solusi yang valid. Atau, lebih sederhana, itu harus menjadi tugas yang mengubah status.

Bahasa apa pun dengan tugas memenuhi syarat, meskipun mungkin ada beberapa di mana tidak ada solusi yang sepenuhnya sah. Saya akan memposting jawaban Ruby saya jika tidak ada orang lain yang mendapatkannya setelah beberapa hari, dan menerima jawaban dengan suara terbanyak secara bergulir.

histokrat
sumber
Haruskah LValue = objgaris diperlukan untuk statebenar-benar berubah? (Saya hanya bisa membuat properti di C # yang bertambah setiap kali Anda mendapatkannya)
Tim S.
2
Ya, itulah yang saya maksudkan dengan mengatakan metode ini harus idempoten. Saya akan mengedit untuk membuatnya lebih jelas.
histokrat
Ok terima kasih. Aku pasti menutupi bagian itu.
Tim S.
4
Apakah hanya mengembalikan refcount objek bekerja?
Nick T
Apakah perubahan destruktif pada objek itu sendiri? EmacsLisp: (setq a (list "val")) (setq b (nconc a "val2"))misalnya. aakhirnya mengevaluasi ("val" . "val2")pada saat itu.
Jonathan Leech-Pepin

Jawaban:

30

C ++

Ini sepele menggunakan alat yang tepat.

#include <iostream>

using namespace std;

class Obj {
public:
   int state;

   Obj& operator= (Obj& foo) {
      foo.state++;
      this->state = foo.state - 2;
      return *this;
   }
};

int main() {
   Obj a, b, c, d;
   a.state = 3;
   b.state = 4;

   cout << a.state << " " << b.state << "\n";

   c = a;
   d = b;

   cout << a.state << " " << b.state << " " << c.state << " " << d.state << "\n";

   return 0;
}

Keluaran:

3 4
4 5 2 3
marinus
sumber
12
Saat saya melihat judulnya, saya tahu seseorang akan melakukan overloading operator. Itu cara yang jelas. Dapatkan upvote.
17

PHP (debug build,> = 5.4)

Kami menggunakan refcount objek dalam pengambil. (Jadi, berdasarkan penugasan, kenaikan jumlah meningkat dan perubahan nilai)

class State {
    public function __get($arg) {
        ob_start();
        debug_zval_dump($this); // e.g. "object(State)#1 (0) refcount(6)"
        return ob_get_clean()[29];
    }
}

$obj = new State;
var_dump($obj->state);
$a = $obj;
var_dump($obj->state);
bwoebi
sumber
14

C #

Dua opsi sederhana:

class Obj
{
    public int state;
    public static implicit operator int(Obj o)
    {
        return o.state++;
    }
}

static int LValueI;
static Obj LValueM { set { value.state++; } }
static void Main()
{
    var obj = new Obj { state = 1 };
    LValueI = obj;
    Console.WriteLine(obj.state); //2, caused by the implicit cast.

    LValueM = obj;
    Console.WriteLine(obj.state); //3, caused by the property setter.
    Console.ReadLine();
}

Atau kita bisa menulis ke memori yang sama:

[StructLayoutAttribute(LayoutKind.Explicit)]
class Program
{
    [FieldOffset(0)]
    int state = 1;
    [FieldOffset(1)]
    int LValue;

    void Test()
    {
        var obj = this;

        Console.WriteLine(state);  //1
        LValue = state;
        Console.WriteLine(state);  //257
        Console.ReadLine();
    }
    static void Main() { new Program().Test(); }
}
NPSF3000
sumber
12

TeX, jauh lebih pendek daripada jawaban lain di sini

\setbox0=\hbox{Hello world!} % Put stuff in the box 0.
\message{\the\wd0}           % Print the width of the box => non-zero
\setbox2=\box0               % Put the box instead in box 2.
\message{\the\wd0}           % Now box 0 is void, hence has zero width.

Sebagai sistem pengaturan huruf, TeX memiliki tipe "kotak", yang berisi bahan huruf. Karena kasus penggunaan yang paling umum adalah memindahkan materi ini, membaginya, dll. Daripada membuat salinannya, kotak biasanya dihapus ketika digunakan (atau lebih tepatnya, variabel "kotak" adalah pointer dan hanya satu pointer pada satu waktu yang dapat menunjukkan ke kotak aktual di memori). Tidak perlu sihir apa pun.

Bruno Le Floch
sumber
8

C ++ 11 (Jadi kalian lupa tentang unique_ptr / shared_ptr :-))

#include <iostream>
#include <memory>
using namespace std;
int main() {
    std::unique_ptr<int> u1(new int(0)), u2;
    std::shared_ptr<int> s1 = std::make_shared<int>(0), s2;
    std::cout<<u1.get()<<" "<<u2.get()<<" "<<std::endl;
    std::cout<<s1.use_count()<<" "<<s2.use_count()<<" "<<std::endl;
    u2 = std::move(u1);
    s2 = s1;
    std::cout<<u1.get()<<" "<<u2.get()<<" "<<std::endl;
    std::cout<<s1.use_count()<<" "<<s2.use_count()<<" "<<std::endl;
   return 0;
}
Abhijit
sumber
7

Fortran 03

Ini agak mirip dengan jawaban Hugo D, tetapi sedikit lebih tersembunyi (sebagian karena siapa # $% ^ yang tahu Object Oriented Fortran)?

module objects
   implicit none

   type ObjDef
      integer :: state
    contains
      procedure :: initObject
      procedure :: printObject
      procedure :: setNew
   end type
 contains
   subroutine initObject(this)
     class(ObjDef) :: this
     this%state = this%state + 1
   end subroutine initObject

   subroutine printObject(this)
     class(ObjDef) :: this
     print '(a,i0)',"this%state = ",this%state
   end subroutine printObject

   subroutine setNew(this,that)
     class(ObjDef) :: this,that
     that%state = this%state
   end subroutine setNew

end module objects

program objectChange
   use objects
   type(ObjDef) :: a,b

   call initObject(a)
   call printObject(a)
   call b%setNew(a)
   call printObject(a)
end program objectChange

Outputnya adalah

this%state = 1
this%state = 0

Jika Anda dapat mengetahui apa yang terjadi, bonus menunjukkan kepada Anda! Jika tidak:

Saat memanggil prosedur setNewdalam formulir call b%setNew(a), bsecara implisit argumen pertama, bukan argumen kedua.

Kyle Kanos
sumber
7

PowerShell

Ini menciptakan objek yang statepropertinya adalah nama-nama variabel yang menunjuk ke objek.

$a = @{}| Add-Member -MemberType:16 -PassThru state -Value {
        (gv|?{$this -eq $_.Value}|%{$_.Name}) -join ','} 

'Before: ' + $a.state
$b = $a
'After: ' + $a.state

Keluaran

Before: a,this
After: a,b,this

Catatan: Ini tidak berfungsi jika tugas terjadi dalam lingkup anak.

'Before: ' + $a.state
&{$b = $a}
'After: ' + $a.state

Keluaran

Before: a,this
After: a,this
Berasal
sumber
Variabel Get-smart!
mazzy
5

Perl 5

Inilah salah satu cara untuk melakukannya di Perl:

package Magic {
    sub new { bless {state => 1} }
    use overload '""' => sub { $_[0]{state}++ };
}
use feature 'say';

my $obj = new Magic;
say $obj->{state};
substr($_, 0) = $obj;
say $obj->{state};

Output ini:

1
2

Penjelasan:

Ini adalah aplikasi overloading secara langsung . Secara khusus, saya membebani operator konversi string "", yang dipanggil ketika objek kelebihan ditugaskan untuksubstr() (yang, ya, adalah nilai hukum di Perl).

Ada juga banyak variabel khusus di Perl yang meringkas apa pun yang ditugaskan padanya. Misalnya, berikut ini juga berfungsi:

my $obj = new Magic;
say $obj->{state};
$0 = $obj;
say $obj->{state};

Solusi alternatif

Inilah cara lain untuk itu:

package Magic {
    use Devel::Peek 'SvREFCNT';
    sub new { bless \my $foo }
    sub state { SvREFCNT ${$_[0]} }
}
use feature 'say';

my $obj = new Magic;
say $obj->state;
my $other = $obj;
say $obj->state;

Di sini, stateadalah metode (kita bisa menjadikannya atribut dengan ikatan lebih lanjut / beban berlebihan, tapi itu akan mempersulit hal-hal) yang secara harfiah menghitung jumlah referensi ke objek. Dengan demikian, tidak seperti dalam solusi pertama, Anda benar-benar harus menetapkan $objvariabel normal yang dapat menyimpan referensi objek untuk membuat perubahan negara.

Ilmari Karonen
sumber
5

JavaScript

Ok, jadi saya membuat versi yang lebih pendek yang berfungsi sebagai SSCCE, tetapi tidak lagi mencoba mem-parse JavaScript dengan benar, sehingga penghitungan referensi mungkin tidak berfungsi ketika dimasukkan ke dalam skrip yang lebih kompleks.

(function run () {
    var lineOne = getLine (1), a, b, x, y, z;
    var x = {
        get state () {
            var x=/([a-z]+)\s*=\s*([a-z]+)/,c;
            return 1 + Object.keys (c = run.toString ().split ('\n').slice (0,getLine (2)).filter (function (a) {return (x.test (a))}).reduce (function (a,b,c,d) {var r=b.match (x),t=r[2];while (a[t]){t=a[t]};a[r[1]]=t;return a}, {v:0})).reduce (function (a,b) {return (c[b]=="x"?1:0) + a},0)
        }
    };
    console.log (x.state);  //1
    console.log (x.state);  //1
    y = x;
    console.log (x.state);  //2
    z = y;
    console.log (x.state);  //3    
    a = z;
    b = a;
    console.log (x.state);  //5
    a = null;
    console.log (x.state);  //4
    b = null;
    console.log (x.state);  //3
})() //1 1 2 3 5 4 3 

function getLine(n) {
   try {
      to
   } catch (dat) {
      var stack = dat.stack.split('\n');
       for (var i = 0; i < stack.length; i++) {
           if (~stack[i].indexOf ('getLine')) break;          
       }
      return dat.stack.split ('\n')[i + ~~n].match (/:(\d+)/)[1] - ~~window.hasOwnProperty ('__commandLineAPI')
   }
}
C5H8NNaO4
sumber
2
Mau jelaskan apa yang kamu lakukan?
Ryan
5
... apa-apaan ini? O_o
Gagang Pintu
@ Dooorknob Seorang pengambil yang mengembalikan hasilnya, memanggil fungsi, yang menghitung seberapa sering nama pengidentifikasi dirujuk sebagai rval, dalam ekspresi penugasan, dalam sourcetext yang diberikan hingga baris tertentu, melewati sumber fungsi penutupnya dan baris tersebut getter dipanggil dari sebagai argumen. Segala sesuatu yang lain adalah tokenizer proporsional berantakan. --- Saya tidak tahu bagaimana lagi saya harus menyebutnya . Dengan kata lain. Dengan kata lain: Sang pengambil menghitung jumlah penugasan referensi ke x hingga garis dari mana ia dipanggil, sisanya adalah tokenizer yang belum selesai.
C5H8NNaO4
1
Terpanjang ... dan terluas!
Nicolas Barbulesco
1
@NicolasBarbulesco Saya membuatnya lebih pendek
C5H8NNaO4
4

Python

Ini sedikit curang, tapi bagaimana dengan:

import gc
class A(object):
    @property
    def state(self):
        return len(gc.get_referrers(self))

a = A()
print a.state
b = {"x": a}
print a.state
a.y = a
print a.state
del a
print b["x"].state
James_pic
sumber
4

C ++ 11

meskipun ini dapat diperluas untuk bahasa lain yang mendukung penghancur implisit / eksplisit

#include <iostream>
using namespace std;

class Foo {
    int *ptr;
public:
    Foo() {
        ptr = new int(0);
    }   
    int state() {
        return *ptr;
    }
    ~Foo() {
        (*ptr)++;
    }
};
int main() {
    Foo a, b;
    cout << a.state() << " " << b.state() << "\n";
    {
        Foo c, d;
        c = a;
        d = b;
    }
   cout << a.state() << " " << b.state()  << "\n";

   return 0;
}

Operator penugasan default melakukan salinan dangkal. Jadi objek penerima masih memiliki pointer dan setiap perubahan secara implisit mempengaruhi objek asli;

Abhijit
sumber
1
Ya, newtanpa satu pun deletedalam program. Meskipun, untuk tugas ini cukup baik menurut saya :)
Ruslan
Apa outputnya?
Nicolas Barbulesco
1
Dari apa yang saya mengerti (C ++ jauh ...), di sini tugasnya tidak mengubah keadaan . Kalau tidak, pindahkan coutgaris ke atas sebelum }dan katakan apakah itu berhasil. :-)
Nicolas Barbulesco
4

Scala

Konversi tersirat memungkinkan Anda menyelesaikan ini sambil menetapkan ke variabel lokal normal:

import scala.language.implicitConversions

class Obj {
  var counter = 0
}

implicit def o2s(x: Obj): String = {
  x.counter += 1
  x.toString
}

val obj = new Obj
println(obj.counter)
val s: String = obj
println(obj.counter)

Anda dapat melakukannya dengan tipe yang disimpulkan:

var s = ""
s = obj

Anda juga dapat menggunakan metode penyetel khusus, meskipun itu membutuhkan nilai L menjadi bidang:

object L {
  var _value = new Obj
  def value = _value
  def value_=(x: Obj): Unit = {
    _value = x
    x.counter += 1
  }
}

val obj = new Obj
println(obj.counter)
L.value = obj
println(obj.counter)
Dan Getz
sumber
3

D

struct Obj {
    int state;

    void opAssign (ref Obj other) {
        ++other.state;
    }
}

void main () {
    import std.stdio;

    Obj obj, lvalue;
    writeln(obj);
    lvalue = obj;
    writeln(obj);
}

Keluaran:

Obj(0)
Obj(1)
Hugo Dubé
sumber
3

Rubi

Seperti yang dijanjikan, inilah jawaban yang menginspirasi pertanyaan.

obj = Class.new { def self.state; to_s[/</] ? "Has not been assigned\n" : "Assigned to #{to_s}"; end }

print obj.state

LValue = obj

print obj.state

Class.newmenciptakan kelas anonim. Memanggil to_spada kelas anonim memberikan representasi string default dari objek, yang terlihat seperti #<Class:0x007fe3b38ed958>. Namun, begitu kelas telah ditetapkan ke konstanta, to_smenjadi konstanta itu. Di Ruby, konstanta adalah variabel yang dimulai dengan huruf besar, jadiobj referensi ke kelas yang memungkinkannya tetap anonim.

Kode saya membungkus to_sdalam suatu statemetode, sehingga hasilnya menjadi

Has not been assigned
Assigned to LValue

Tidak seperti kebanyakan solusi di sini, ini hanya berfungsi sekali: menetapkan objke konstanta lain tidak akan mengubah representasi string-nya, dan tidak satu pun akan menetapkan nilai baru untuk LValue.

histokrat
sumber
3

Di jawa

Saya pikir ini tidak mungkin di Jawa. Tapi…

Kelas utama:

public class MyAppOfCats {

  public static void main(String[] args) {
    Cat tom = new Cat();
    System.out.println(tom.state()); 
    // Output : NOT-BEST-CAT
    Cat.bestCat = tom;
    System.out.println(tom.state());
    // Output : BEST-CAT
  }

}

Kucing Kelas:

public class Cat {

  static Cat bestCat;

  public Cat() {
    super();
  }

  public String state() {
      return ((this == Cat.bestCat) ? "BEST-CAT" : "NOT-BEST-CAT");
  }

}

Saya terinspirasi oleh @tbodt.

Nicolas Barbulesco
sumber
1
Saya tahu ini bukan kode-golf, tetapi Anda sadar bahwa Anda bisa menghapus konstruktor dan itu masih sama, kan?
David Conrad
2
Ini bukan "objek yang statusnya berubah pada tugas". Ini adalah Anda memanipulasi nilai global dan kemudian mencetak sesuatu berdasarkan itu. Tidak ada bedanya dengan Cat.x = 2kemudian mencetak Cat.x.
Chris Hayes
@ Chris - Status objek didasarkan pada "nilai global". Jadi status objek berubah pada tugas. Pertanyaannya menyatakan ;-) bahwa negara dapat menjadi metode deterministik, idempoten. Status metode saya () adalah metode seperti itu.
Nicolas Barbulesco
Tidak, status objek berubah pada tugas khusus ini . Jika saya lakukan Cat otherCat = tomnegara tidak akan berubah sama sekali. Saya sulit percaya bahwa ini memenuhi surat atau semangat peraturan.
Chris Hayes
@ Chris - Tentu saja objek berubah pada tugas ini! Pertanyaannya menanyakan objek yang keadaannya diubah oleh tugas. Bukan untuk objek yang kondisinya diubah oleh tugas apa pun.
Nicolas Barbulesco
3

C ++

Perilaku ini sebenarnya ditentukan dalam standar (dan itulah sebabnya itu sudah ditinggalkan).

#include<iostream>
#include<memory>
int main()
{
    std::auto_ptr<int> a(new int(0));
    std::cout<<a.get()<<'\n';
    std::auto_ptr<int> b = a;
    std::cout<<a.get()<<'\n';
}

Keluaran

some address
0

Proses yang menyebabkan ini sama dengan jawaban Abhijit tetapi tanpa memerlukan a std::move dan sama dengan jawaban marinus tetapi menggunakan kelas standar alih-alih mendefinisikannya sendiri.

Sunting: Saya menambahkan beberapa penjelasan. Dalam output, "beberapa alamat" sebenarnya akan menjadi nilai hex untuk alamat integer yang dialokasikan. std::auto_ptrmelepaskan pointer store ketika ditugaskan ke yang lain auto_ptrdan menetapkan pointer internal ke 0. Memanggil get()mengambil akses ke pointer toko.

JKor
sumber
Saya menduga bahwa "output" di sini bukanlah output yang sebenarnya.
Nicolas Barbulesco
Bisakah Anda menjelaskan apa yang seharusnya dilakukan? Terutama metodenya get()? Mengapa mengembalikan 0 di akhir?
Nicolas Barbulesco
@Nicholas ya. Output ini bukan output yang sebenarnya, tetapi output yang lebih umum (saya juga tidak memiliki akses ke kompiler jadi saya tidak punya contoh alamat yang valid pada saat itu).
JKor
1
Hm, ini gagal dikompilasi pada gcc 4.8.
Michael Hampton
1
Saya memperbaiki kesalahan kompilasi. Masih ada peringatan jika Anda mengkompilasi untuk c ++ 11 karena auto_ptrsudah usang.
JKor
3

Python

import sys
class K:state = property(sys.getrefcount)
pppery
sumber
2

Python 2.x

Saya tidak dapat menemukan cara yang tepat untuk melakukan ini tanpa mendefinisikan kelas tambahan.

class State(object):
    def __init__(self):
        self.state = 0
    def __set__(self, obj, other):
        # Keep different references
        other.state += 1
        self.state += 2

class Program(object):
    obj, value = State(), State() # Create two State-objects
    def __init__(self):
        print "Before assignment:", self.obj.state, self.value.state # 0 0
        self.value = self.obj # Set value to obj (supposedly)
        print "After  assignment:", self.obj.state, self.value.state # 1 2
        self.value = self.obj
        print "2nd    assignment:", self.obj.state, self.value.state # 2 4

Program()
seequ
sumber
2

Jawa

Semua solusi lain menggunakan bentuk bahasa operator yang berlebihan. Java tidak memiliki kelebihan operator, jadi saya pikir saya macet. Tapi saya datang dengan sesuatu.

Inilah kelas utamanya:

public class Program {
    public static void main(String[] args) {
        Thing thing = new Thing(0);
        System.out.println(thing.getState());
        Thing.otherThing = thing;
        Thread.sleep(1);
        System.out.println(thing.getState());
    }
}

Ada beberapa baris yang mencurigakan, tetapi mereka tidak akan melakukan apa pun jika Thingkelasnya benar-benar normal. Bukan:

public class Thing {
    private int state;

    public Thing(int state) {
        this.state = state;
    }

    public int getState() {
        return state;
    }

    // Please do your best to ignore the rest of this class.
    public static volatile Thing otherThing;
    static {
        Thread t = new Thread() {
            public void run() {
                Thing t = otherThing;
                while (true)
                    if (t != otherThing) {
                        t = otherThing;
                        t.state++;
                    }
            }
        };
        t.setDaemon(true);
        t.start();
    }
}

Ini tidak dijamin berfungsi karena utasnya, tapi saya mengujinya di JDK 1.8u5, dan itu berfungsi di sana.

tbodt
sumber
@KyleKanos Singkirkan semua karakter unicode> U + 00FF
tbodt
1

Gangguan umum

Saya mendefinisikan status sebagai jumlah variabel khusus yang terikat pada vektor. Jadi, penugasan ke variabel khusus mengubah status.

(defgeneric state (object)
  (:documentation "Get the state of this object."))

(defmethod state ((object vector))
  ;; The state of a vector is the number of symbols bound to it.
  (let ((count 0))
    ;; Iterate each SYM, return COUNT.
    (do-all-symbols (sym count)
      ;; When SYM is bound to this vector, increment COUNT.
      (when (and (boundp sym) (eq (symbol-value sym) object))
    (incf count)))))

(defparameter *a* #(this is a vector))
(defparameter *b* nil)
(defparameter *c* nil)

(print (state *a*))
(setf *b* *a*)
(print (state *a*))
(print (state *a*))
(setf *c* *a*)
(print (state *a*))

Keluaran:

1 
2 
2 
3 

Ini hanya bekerja dengan penugasan ke variabel khusus, bukan ke variabel leksikal, atau ke slot dalam suatu objek.

Waspadalah itu do-all-symbols terlihat di semua paket, sehingga melewatkan variabel yang tidak memiliki paket. Mungkin menghitung simbol ganda yang ada di lebih dari satu paket (ketika satu paket mengimpor simbol dari paket lain).

Rubi

Ruby hampir sama, tetapi saya mendefinisikan status sebagai jumlah konstanta yang merujuk pada array.

class Array
  # Get the state of this object.
  def state
    # The state of an array is the number of constants in modules
    # where the constants refer to this array.
    ObjectSpace.each_object(Module).inject(0) {|count, mod|
      count + mod.constants(false).count {|sym|
        begin
          mod.const_get(sym, false).equal?(self)
        rescue NameError
          false
        end
      }
    }
  end
end

A = %i[this is an array]
puts A.state
B = A
puts A.state
puts A.state
C = A
puts A.state

Keluaran:

state-assign.rb:9:in `const_get': Use RbConfig instead of obsolete and deprecated Config.
1
2
2
3

Ini adalah generalisasi dari jawaban histokrat untuk objek-objek Ruby yang bukan kelas atau modul. Peringatan muncul karena konstanta Config secara otomatis memuat beberapa kode yang membuat peringatan.

kernigh
sumber
0

C ++

Hasilnya mungkin berbeda di platform yang berbeda. Diuji pada ideone .

#include <iostream>
#include <cassert>
// File format: [ciiiiciiii...] a char (1 byte) followed by its state (4 bytes)
// Each group takes 5 bytes
char Buffer[30]; // 5*6, six groups

struct Group {
    char c;
    int state;
};

int main(void) {
    assert(sizeof(char) == 1);
    assert(sizeof(int) == 4);

    Group& first_group = *(Group*)(&Buffer[0]); // Group 1 is at 0
    Group& second_group = *(Group*)(&Buffer[5]); // Group 2 is at 5

    first_group.c = '2';
    first_group.state = 1234;

    std::cout << first_group.state << std::endl;

    second_group = first_group;

    std::cout << first_group.state << std::endl;

    return 0;
}

Keluaran:

1234
13010
jingyu9575
sumber
0

C #

class A
{
    public int N { get; set; }
    public override string ToString() { return N.ToString(); }
}
class B
{
    public int N { get; set; }
    public override string ToString() { return N.ToString(); }
    public static implicit operator A(B b) { b.N = -b.N; return new A { N = b.N }; }
}
public static void Test()
{
    A a = new A { N = 1 };
    B b = new B { N = 2 };
    Console.WriteLine("a is {0}, b is {1}", a, b);
    Console.WriteLine("a is {0}, b is {1}", a, b);
    a = b;
    Console.WriteLine("a is {0}, b is {1}", a, b);
    Console.WriteLine("a is {0}, b is {1}", a, b);
}

Keluaran:

a is 1, b is 2
a is 1, b is 2
a is -2, b is -2
a is -2, b is -2
KlikRick
sumber
Apa fungsinya? Apakah ini membebani operator =?
Nicolas Barbulesco
@ Nicolas Tidak persis. Itu ketika casting dari a Bke an A, karena implicit operator A(B b)memiliki efek samping.
ClickRick