การกำหนดในคำสั่ง if


142

ฉันได้เรียนAnimalและ Dogsubclass ฉันมักจะพบว่าตัวเองเข้ารหัสบรรทัดต่อไปนี้:

if (animal is Dog)
{
    Dog dog = animal as Dog;    
    dog.Name;    
    ... 
}

Animal animal;สำหรับตัวแปร

มีไวยากรณ์ที่อนุญาตให้ฉันเขียนบางอย่างเช่น:

if (Dog dog = animal as Dog)
{    
    dog.Name;    
    ... 
}

1
มันจะหมายถึงอะไร? สิ่งที่จะboolสภาพเป็นอย่างไร
Kirk Woll

ไม่มีที่ฉันรู้ มีเหตุผลใดที่จะไม่ย้ายชื่อขึ้นไปเป็นสัตว์?
AlG

22
เพียงแค่ทราบรหัสเช่นมักจะเป็นผลมาจากหนึ่งในการทำลายของหลักการ SOLID L - Liskov ชดเชยหลักการ ไม่ได้พูดว่ามันผิดที่จะทำสิ่งที่คุณทำอยู่ตลอดเวลา แต่อาจคุ้มค่าที่จะคิด
ckittel

โปรดรับทราบถึงสิ่งที่ @ckittel กำลังทำอยู่คุณอาจไม่ต้องการทำสิ่งนี้
khebbie

1
@Solo no,! null= falseใน C #; C # อนุญาตเฉพาะบูลที่เกิดขึ้นจริงหรือสิ่งที่เปลี่ยนแปลงได้โดยปริยายเป็นบูลในifเงื่อนไข ไม่ว่าค่า Null หรือชนิดจำนวนเต็มใด ๆ สามารถแปลงเป็น bools ได้
Roman Starkov

คำตอบ:


323

คำตอบด้านล่างนี้เขียนขึ้นเมื่อหลายปีก่อนและอัปเดตเมื่อเวลาผ่านไป ตั้งแต่ C # 7 คุณสามารถใช้การจับคู่รูปแบบ:

if (animal is Dog dog)
{
    // Use dog here
}

โปรดทราบว่าdogยังอยู่ในขอบเขตหลังจากifคำสั่ง แต่ไม่ได้รับมอบหมายอย่างแน่นอน


ไม่ไม่มี มันเป็นสำนวนที่จะเขียนสิ่งนี้มากกว่า:

Dog dog = animal as Dog;
if (dog != null)
{
    // Use dog
}

เมื่อพิจารณาว่า "ตามด้วยถ้า" ใช้วิธีนี้เกือบตลอดเวลามันอาจสมเหตุสมผลกว่าที่จะมีโอเปอเรเตอร์ซึ่งดำเนินการทั้งสองส่วนในคราวเดียว ปัจจุบันนี้ไม่ได้อยู่ใน C # 6 แต่อาจเป็นส่วนหนึ่งของ C # 7 หากมีการนำข้อเสนอการจับคู่รูปแบบมาใช้

ปัญหาคือว่าคุณไม่สามารถประกาศตัวแปรในส่วนเงื่อนไขของifคำสั่งที่1 วิธีการที่ใกล้เคียงที่สุดที่ฉันนึกได้คือ:

// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
    ...
}

นั่นเป็นเพียงที่น่ารังเกียจ ... (ฉันได้พยายามเพียงแค่มันและมันไม่ทำงาน. แต่โปรดกรุณาอย่าทำเช่นนี้. Oh, และคุณสามารถประกาศdogใช้varแน่นอน.)

แน่นอนคุณสามารถเขียนวิธีการขยาย:

public static void AsIf<T>(this object value, Action<T> action) where T : class
{
    T t = value as T;
    if (t != null)
    {
        action(t);
    }
}

จากนั้นโทรหาด้วย:

animal.AsIf<Dog>(dog => {
    // Use dog in here
});

อีกวิธีหนึ่งคุณสามารถรวมสองสิ่งนี้เข้าด้วยกัน:

public static void AsIf<T>(this object value, Action<T> action) where T : class
{
    // EVIL EVIL EVIL
    for (var t = value as T; t != null; t = null)
    {
        action(t);
    }
}

คุณยังสามารถใช้วิธีการขยายโดยไม่มีการแสดงออกแลมบ์ดาในวิธีที่สะอาดกว่าสำหรับลูป:

public static IEnumerable<T> AsOrEmpty(this object value)
{
    T t = value as T;
    if (t != null)
    {
        yield return t;
    }
}

แล้ว:

foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
    // use dog
}

1คุณสามารถกำหนดค่าในifคำสั่งแม้ว่าฉันจะไม่ค่อยทำ มันไม่เหมือนกับการประกาศตัวแปร มันไม่ได้ชะมัดที่ผิดปกติสำหรับผมที่จะทำมันในwhileแต่เมื่ออ่านลำธารของข้อมูล ตัวอย่างเช่น:

string line;
while ((line = reader.ReadLine()) != null)
{
    ...
}

วันนี้ปกติฉันชอบใช้เสื้อคลุมที่ให้ฉันใช้foreach (string line in ...)แต่ฉันดูด้านบนเป็นรูปแบบสวย ปกติแล้วมันจะไม่ดีที่จะมีผลข้างเคียงภายในเงื่อนไข แต่ตัวเลือกมักจะเกี่ยวข้องกับการทำสำเนารหัสและเมื่อคุณรู้ว่ารูปแบบนี้จะทำให้ถูกต้องได้ง่าย


76
+1 สำหรับการให้คำตอบและขอร้องว่า OP ไม่ได้ใช้ คลาสสิกทันที
ckittel

8
@ พอล: ถ้าฉันพยายามขายให้กับทุกคนฉันจะไม่แนะนำพวกเขาอย่างเด็ดขาดว่าจะไม่ใช้มัน ฉันแค่การแสดงสิ่งที่เป็นไปได้
Jon Skeet

12
@ พอล: ฉันคิดว่าอาจเป็นแรงบันดาลใจที่อยู่เบื้องหลังEVIL EVIL EVILแต่ฉันไม่แน่ใจ
อดัมโรบินสัน

18
ฉันทำวิธีการขยายที่คล้ายกัน (ด้วยการโอเวอร์โหลดจำนวนมาก) เมื่อไม่นานมานี้และฉันโทรหาพวกเขาAsEither(...)ฉันคิดว่ามันค่อนข้างชัดเจนกว่าAsIf(...)ดังนั้นฉันจึงสามารถเขียนmyAnimal.AsEither(dog => dog.Woof(), cat => cat.Meeow(), unicorn => unicorn.ShitRainbows())ได้
herzmeister

97
นั่นเป็นการละเมิดที่ดีที่สุดของ C # ที่ฉันเคยเห็นมาพักหนึ่งแล้ว เห็นได้ชัดว่าคุณเป็นอัจฉริยะที่ชั่วร้าย
Eric Lippert

48

หากล้มเหลวก็จะส่งกลับasnull

Dog dog = animal as Dog;

if (dog != null)
{
    // do stuff
}

ก่อนอื่นขอบคุณ ประการที่สองฉันต้องการสร้างตัวแปรสุนัขในขอบเขตของifคำสั่งไม่ใช่ในขอบเขตภายนอก
ไมเคิล

@Michael คุณไม่สามารถทำได้ในประโยค if ถ้าต้องมีผลบูลไม่ใช่การมอบหมาย Jon Skeet มีชุดค่าผสมทั่วไปและแลมบ์ดาที่คุณควรพิจารณาด้วย
Rodney S. Foley

ifสามารถมีผลบูลและการมอบหมาย Dog dog; if ((dog = animal as Dog) != null) { // Use Dog }แต่นั่นยังคงแนะนำตัวแปรในขอบเขตด้านนอก
Tom Mayfield

12

คุณสามารถกำหนดค่าให้กับตัวแปรได้ตราบใดที่ตัวแปรนั้นมีอยู่แล้ว คุณยังสามารถกำหนดขอบเขตตัวแปรเพื่ออนุญาตให้ใช้ชื่อตัวแปรนั้นอีกครั้งในภายหลังในวิธีการเดียวกันหากเป็นปัญหา

public void Test()
{
    var animals = new Animal[] { new Dog(), new Duck() };

    foreach (var animal in animals)
    {
        {   // <-- scopes the existence of critter to this block
            Dog critter;
            if (null != (critter = animal as Dog))
            {
                critter.Name = "Scopey";
                // ...
            }
        }

        {
            Duck critter;
            if (null != (critter = animal as Duck))
            {
                critter.Fly();
                // ...
            }
        }
    }
}

ทะลึ่ง

public class Animal
{
}

public class Dog : Animal
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            Console.WriteLine("Name is now " + _name);
        }
    }
}

public class Duck : Animal
{
    public void Fly()
    {
        Console.WriteLine("Flying");
    }
}

รับเอาท์พุท:

Name is now Scopey
Flying

รูปแบบของการกำหนดตัวแปรในการทดสอบใช้เมื่ออ่านบล็อกไบต์จากสตรีมเช่น:

int bytesRead = 0;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
{
    // ...
}

รูปแบบของการกำหนดขอบเขตตัวแปรที่ใช้ด้านบนนั้นไม่ใช่รูปแบบรหัสทั่วไปโดยเฉพาะและหากฉันเห็นว่ามีการใช้งานทั่วสถานที่ฉันจะมองหาวิธีในการปรับโครงสร้างใหม่


11

มีไวยากรณ์ที่อนุญาตให้ฉันเขียนบางอย่างเช่น:

if (Dog dog = animal as Dog) { ... dog ... }

?

น่าจะมีใน C # 6.0 คุณลักษณะนี้เรียกว่า "นิพจน์การประกาศ" ดู

https://roslyn.codeplex.com/discussions/565640

สำหรับรายละเอียด

ไวยากรณ์ที่เสนอคือ:

if ((var i = o as int?) != null) {  i  }
else if ((var s = o as string) != null) {  s  }
else if ...

โดยทั่วไปคุณลักษณะที่นำเสนอก็คือการประกาศตัวแปรท้องถิ่นอาจจะใช้เป็นแสดงออก ifไวยากรณ์นี้เป็นเพียงผลลัพธ์ที่ดีของคุณสมบัติทั่วไปมากขึ้น


1
ภาพรวมดูเหมือนว่าจะอ่านน้อยลงแล้วแค่ประกาศตัวแปรอย่างที่คุณทำในวันนี้ คุณจะรู้หรือไม่ว่าเหตุใดคุณสมบัติเฉพาะนี้จึงผ่านแถบจุด -100
asawyer

3
@asawyer: ก่อนอื่นนี่เป็นคุณสมบัติที่ร้องขอบ่อยมาก ประการที่สองภาษาอื่นมีส่วนขยายนี้เป็น "ถ้า"; ตัวอย่างเช่น gcc อนุญาตให้เทียบเท่าใน C ++ ประการที่สามคุณสมบัติทั่วไปมากกว่าเพียงแค่ "ถ้า" ตามที่ระบุไว้ ประการที่สี่มีแนวโน้มใน C # ตั้งแต่ C # 3.0 เพื่อทำสิ่งต่างๆมากขึ้นซึ่งต้องการบริบทคำสั่งแทนที่จะต้องการบริบทการแสดงออก สิ่งนี้จะช่วยในการเขียนโปรแกรมในรูปแบบการใช้งาน ดูหมายเหตุการออกแบบภาษาสำหรับรายละเอียดเพิ่มเติม
Eric Lippert

2
@asawyer: ไม่เป็นไร! อย่าลังเลที่จะมีส่วนร่วมในการสนทนาบน Roslyn.codeplex.com หากคุณมีความคิดเห็นเพิ่มเติม นอกจากนี้ฉันขอเพิ่ม: ประการที่ห้าโครงสร้างพื้นฐาน Roslyn ใหม่ช่วยลดต้นทุนส่วนเพิ่มให้กับทีมงานของการใช้คุณสมบัติการทดลองขนาดเล็กเหล่านี้ซึ่งหมายความว่าขนาดของคะแนน "ลบ 100" จะลดลง ทีมกำลังใช้โอกาสนี้ในการสำรวจคุณสมบัติเล็ก ๆ ที่เหมาะสมอย่างสมบูรณ์แบบซึ่งได้รับการร้องขอมานาน แต่ไม่เคยทำให้เหนืออุปสรรค -100 จุดก่อนหน้านี้
Eric Lippert

1
ผู้อ่านความคิดเห็นเหล่านี้ที่สับสนเกี่ยวกับสิ่งที่ "คะแนน" ที่เรากำลังพูดถึงควรอ่านโพสต์บล็อกของ Eric Gunnerson อดีตนักออกแบบ C # ในหัวข้อนี้: blogs.msdn.com/b/ericgu/archive/2004/01/12/57985 aspx นี่คือการเปรียบเทียบ ไม่มีการนับ "คะแนน" ตามจริง
Eric Lippert

@asawyer: ฉันคิดว่าคุณสมบัตินี้เปล่งประกายในการโทรหาTry*(เช่น, TryParse) คุณลักษณะนี้ไม่เพียง แต่ทำให้การเรียกดังกล่าวเป็นนิพจน์เดียว (เท่าที่ควรจะเป็น IMO) แต่ยังช่วยให้การกำหนดขอบเขตที่สะอาดของตัวแปรดังกล่าว ฉันกระตือรือร้นเกี่ยวกับการกำหนดoutพารามิเตอร์ของTryวิธีการที่จะกำหนดขอบเขตตามเงื่อนไขของมัน สิ่งนี้ทำให้ยากที่จะแนะนำข้อบกพร่องบางประเภท
Brian

9

หนึ่งในวิธีการขยายที่ฉันพบว่าตัวเองเขียนและใช้บ่อย * คือ

public static TResult IfNotNull<T,TResult>(this T obj, Func<T,TResult> func)
{
    if(obj != null)
    {
        return func(obj);
    }
    return default(TResult);
}

ซึ่งสามารถใช้ในสถานการณ์นี้ได้เช่น

string name = (animal as Dog).IfNotNull(x => x.Name);

และnameเป็นชื่อของสุนัข (หากเป็นสุนัข) มิฉะนั้นจะเป็นโมฆะ

* ฉันไม่รู้ว่านี่เป็นนักแสดงหรือเปล่า มันไม่เคยเกิดขึ้นเป็นคอขวดในการทำโปรไฟล์


2
+1 สำหรับบันทึกย่อ หากไม่เคยเกิดปัญหาคอขวดในการทำโปรไฟล์นั่นเป็นสัญญาณที่ดีว่าเป็นสิ่งที่มีประสิทธิภาพเพียงพอ
Cody Gray

เหตุใดคุณจึงต้องใช้ค่าเริ่มต้นเป็นอาร์กิวเมนต์และให้ผู้โทรตัดสินใจว่าอะไรที่ฉัน z แทนที่จะกลับไปใช้ค่าเริ่มต้น (.... )
ตรีศูล D'Gao

5

ไปเทียบกับเมล็ดข้าวที่นี่ แต่บางทีคุณอาจทำผิดในตอนแรก การตรวจสอบชนิดของวัตถุมักจะเป็นกลิ่นรหัส ตัวอย่างสัตว์ของคุณมีชื่อหรือไม่? จากนั้นเพียงโทรหา Animal.name โดยไม่ตรวจสอบว่าเป็นสุนัขหรือไม่

อีกวิธีหนึ่งคือสลับวิธีการเพื่อให้คุณเรียกวิธีการในสัตว์ที่ทำสิ่งที่แตกต่างกันขึ้นอยู่กับชนิดของสัตว์ที่เป็นรูปธรรม ดูเพิ่มเติมที่: ความหลากหลาย



3

นี่คือรหัสสกปรกเพิ่มเติม (ไม่สกปรกเหมือนของ Jon แต่ :-)) ขึ้นอยู่กับการแก้ไขคลาสพื้นฐาน ฉันคิดว่ามันจับความตั้งใจในขณะที่อาจพลาดจุด:

class Animal
{
    public Animal() { Name = "animal";  }
    public List<Animal> IfIs<T>()
    {
        if(this is T)
            return new List<Animal>{this};
        else
            return new List<Animal>();
    }
    public string Name;
}

class Dog : Animal
{
    public Dog() { Name = "dog";  }
    public string Bark { get { return "ruff"; } }
}


class Program
{
    static void Main(string[] args)
    {
        var animal = new Animal();

        foreach(Dog dog in animal.IfIs<Dog>())
        {
            Console.WriteLine(dog.Name);
            Console.WriteLine(dog.Bark);
        }
        Console.ReadLine();
    }
}

3

หากคุณต้องทำหลายอย่างเช่น-IFS หนึ่งหลังจากที่หนึ่ง (และใช้ความแตกต่างไม่ได้ตัวเลือก) พิจารณาการใช้SwitchOnTypeสร้าง


3

ปัญหา (ที่มีไวยากรณ์) ไม่ได้อยู่กับการมอบหมายเนื่องจากผู้ประกอบการที่ได้รับมอบหมายใน C # เป็นนิพจน์ที่ถูกต้อง แต่เป็นการประกาศที่ต้องการเนื่องจากการประกาศเป็นข้อความสั่ง

ถ้าฉันต้องเขียนโค้ดแบบนั้นบางครั้งฉันจะ (ขึ้นอยู่กับบริบทที่ใหญ่กว่า) เขียนโค้ดดังนี้:

Dog dog;
if ((dog = animal as Dog) != null) {
    // use dog
}

มีข้อดีกับไวยากรณ์ข้างต้น (ซึ่งอยู่ใกล้กับไวยากรณ์ที่ร้องขอ) เพราะ:

  1. ใช้dog นอกifจะส่งผลในการรวบรวมข้อผิดพลาดที่มันไม่ได้กำหนดค่าอื่น ๆ (นั่นคือไม่ได้มอบหมายdogที่อื่น)
  2. วิธีการนี้สามารถขยายได้อย่างดีถึงif/else if/...(มีเพียงมากasเท่าที่จำเป็นในการเลือกสาขาที่เหมาะสม; นี่เป็นกรณีใหญ่ที่ฉันเขียนในรูปแบบนี้เมื่อฉันต้อง.)
  3. is/asการทำสำเนาหลีกเลี่ยงของ (แต่ทำด้วยDog dog = ...แบบฟอร์มด้วย)
  4. ไม่แตกต่างจาก "สำนวนในขณะที่" (อย่าเพิ่งถูกกำจัด: รักษาเงื่อนไขให้อยู่ในรูปแบบที่สอดคล้องและเรียบง่าย)

เพื่อแยกออกdogจากส่วนที่เหลือของโลกอย่างแท้จริงสามารถใช้บล็อกใหม่:

{
  Dog dog = ...; // or assign in `if` as per above
}
Bite(dog); // oops! can't access dog from above

การเข้ารหัสที่มีความสุข


จุด # 1 ที่คุณเสนอเป็นสิ่งแรกที่อยู่ในใจของฉัน ประกาศตัวแปร แต่กำหนดใน if เท่านั้น ตัวแปรนั้นไม่สามารถอ้างอิงได้จากภายนอกหากไม่มีข้อผิดพลาดคอมไพเลอร์ - สมบูรณ์แบบ!
Ian Yates

1

คุณสามารถใช้บางอย่างเช่นนั้น

// ประกาศตัวแปร bool temp = false;

 if (previousRows.Count > 0 || (temp= GetAnyThing()))
                                    {
                                    }

0

อีกโซลูชัน EVIL พร้อมด้วยวิธีการขยาย :)

public class Tester
{
    public static void Test()
    {
        Animal a = new Animal();

        //nothing is printed
        foreach (Dog d in a.Each<Dog>())
        {
            Console.WriteLine(d.Name);
        }

        Dog dd = new Dog();

        //dog ID is printed
        foreach (Dog dog in dd.Each<Dog>())
        {
            Console.WriteLine(dog.ID);
        }
    }
}

public class Animal
{
    public Animal()
    {
        Console.WriteLine("Animal constructued:" + this.ID);
    }

    private string _id { get; set; }

    public string ID { get { return _id ?? (_id = Guid.NewGuid().ToString());} }

    public bool IsAlive { get; set; }
}

public class Dog : Animal 
{
    public Dog() : base() { }

    public string Name { get; set; }
}

public static class ObjectExtensions
{
    public static IEnumerable<T> Each<T>(this object Source)
        where T : class
    {
        T t = Source as T;

        if (t == null)
            yield break;

        yield return t;
    }
}

ฉันชอบวิธีที่สะอาด:

Dog dog = animal as Dog;

if (dog != null)
{
    // do stuff
}

0

คำสั่ง if จะไม่อนุญาตให้ทำ แต่สำหรับ for loop จะ

เช่น

for (Dog dog = animal as Dog; dog != null; dog = null)
{
    dog.Name;    
    ... 
}

ในกรณีที่วิธีการทำงานไม่ชัดเจนทันทีนี่คือคำอธิบายทีละขั้นตอนของกระบวนการ:

  • สุนัขตัวแปรถูกสร้างขึ้นเป็นสุนัขประเภทและได้รับมอบหมายสัตว์ตัวแปรที่ถูกโยนให้กับสุนัข
  • หากการมอบหมายล้มเหลวแสดงว่า dog เป็นโมฆะซึ่งทำให้เนื้อหาของ for for loop ไม่สามารถทำงานได้เนื่องจากมันถูกแยกออกทันที
  • หากการมอบหมายสำเร็จแล้วการวนซ้ำจะ
    ทำซ้ำ
  • ในตอนท้ายของการวนซ้ำตัวแปร dog จะถูกกำหนดค่าเป็น null ซึ่งแบ่งออกจากลูป for


0

IDK ถ้าสิ่งนี้ช่วยใครก็ได้ แต่คุณสามารถลองใช้ TryParse เพื่อกำหนดตัวแปรของคุณ นี่คือตัวอย่าง:

if (int.TryParse(Add(Value1, Value2).ToString(), out total))
        {
            Console.WriteLine("I was able to parse your value to: " + total);
        } else
        {
            Console.WriteLine("Couldn't Parse Value");
        }


        Console.ReadLine();
    }

    static int Add(int value1, int value2)
    {
        return value1 + value2;
    }

รวมตัวแปรจะได้รับการประกาศก่อนถ้าคำสั่ง


0

ฉันเพิ่ง inline คำสั่ง if เพื่อสร้างบรรทัดของโค้ดที่ดูเหมือนสิ่งที่คุณสนใจมันแค่ช่วยบีบอัดโค้ดบางอย่างและฉันพบว่ามันจะอ่านง่ายขึ้นโดยเฉพาะเมื่อทำการซ้อนการมอบหมาย:

var dog = animal as Dog; if (dog != null)
{
    Console.WriteLine("Parent Dog Name = " + dog.name);

    var purebred = dog.Puppy as Purebred; if (purebred != null)
    {
         Console.WriteLine("Purebred Puppy Name = " + purebred.Name);
    }

    var mutt = dog.Puppy as Mongrel; if (mutt != null)
    {
         Console.WriteLine("Mongrel Puppy Name = " + mutt.Name);
    }
 }

0

ฉันรู้ว่าฉันสุดสายไปงานปาร์ตี้ แต่ฉันคิดว่าฉันจะโพสต์วิธีการแก้ปัญหาของตัวเองไปสู่ภาวะที่กลืนไม่เข้าคายไม่ออกนี้เพราะฉันยังไม่เห็นมันที่นี่ (หรือที่ใดก็ได้สำหรับเรื่องนั้น)

/// <summary>
/// IAble exists solely to give ALL other Interfaces that inherit IAble the TryAs() extension method
/// </summary>
public interface IAble { }

public static class IAbleExtension
{
    /// <summary>
    /// Attempt to cast as T returning true and out-ing the cast if successful, otherwise returning false and out-ing null
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="able"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    public static bool TryAs<T>(this IAble able, out T result) where T : class
    {
        if (able is T)
        {
            result = able as T;
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }

    /// <summary>
    /// Attempt to cast as T returning true and out-ing the cast if successful, otherwise returning false and out-ing null
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    public static bool TryAs<T>(this UnityEngine.Object obj, out T result) where T : class
    {
        if (obj is T)
        {
            result = obj as T;
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }
}

ด้วยสิ่งนี้คุณสามารถทำสิ่งต่าง ๆ เช่น:

if (animal.TryAs(out Dog dog))
{
    //Do Dog stuff here because animal is a Dog
}
else
{
    //Cast failed! animal is not a dog
}

หมายเหตุสำคัญ: หากคุณต้องการใช้ TryAs () โดยใช้ส่วนต่อประสานคุณจะต้องมีส่วนต่อประสานที่ได้รับ IAble

สนุก! 🙂

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.