هل C# 4.0 و مجموعة من المعلمات الاختيارية و الزائدة تعطيك تحذيرا حول الغموض ؟

StackOverflow https://stackoverflow.com/questions/1211203

سؤال

لقد بدأت القراءة جون السكيت هو الوصول المبكر نسخة من كتابه الذي يحتوي على أقسام C# 4.0 و شيء واحد ضرب لي.للأسف أنا لم يكن لديك Visual Studio 2010 المتاحة لذلك فكرت في أن أسأل هنا بدلا من ذلك ومعرفة ما إذا كان أي شخص يعرف الجواب.

إذا كان لدي البرمجية التالية خليط من القائمة رمز رمز جديد:

public void SomeMethod(Int32 x, Int32 y) { ... }

public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }

سوف مترجم يشكو إما في تعريف الموقع أو الاتصال الموقع عن الغموض ؟

على سبيل المثال, ما هذا قطعة من التعليمات البرمجية في الواقع ؟

SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);

سوف تجميع?سوف اتصل واحد دون z المعلمة ، أم أنها دعوة واحدة مع z المعلمة ؟

هل كانت مفيدة؟

المحلول

فإنه سيتم تجميع دون تحذيرات اختيار الأولى الزائد.

مع الأخذ اختياري المسمى المعلمات الزائد القرار آلية C# أصبحت معقدة حقا.في هذه الحالة المحددة ، فمن المنطقي ولكن.كالعادة, مترجم اختيار الأكثر تحديدا الزائد الذي يطابق الحجج.

أنا لا أصدق هذه الحالة المحددة يختلف كثيرا عن C# 1.0:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }

الذي يعمل مماثل (في شروط الزائد القرار).

متابعة الجواب: أنا لا أعتقد ذلك.أخشى عليك يدويا تحديد الافتراضي حجة في استدعاء الأسلوب.ومع ذلك ، إذا x أو y المعلمة كان اسم مختلف مثل:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }

هل يمكن أن تختار الثانية الزائد مع:

obj.SomeMethod(t: 10, y: 20);

نصائح أخرى

وهذا هو تغطية في قسم "الزائد الحل" من هذا الفصل.

عند ديه مترجم خيارين خلاف متساوية للاختيار من بينها، فإنه سيتم استخدام الزائد الذي لا يحتاج استخدام أي المعلمات الاختيارية unsupplied في تفضيل لاحد أن يفعل، لكنه خيار ثنائي صارم. إذا كان لديه الاختيار بين الزائد مع واحد المعلمة الاختيارية unsupplied واثنين، وسوف نرى أن أن يكون الوضع غامضا.

للرد على المتابعة تعليق، وأنا لا أعرف أي وسيلة لإجبار الزائد مع المعلمة اختيارية ليتم استخدامها دون تحديد ذلك. لا يمكنك استخدام أي من هذه، على سبيل المثال:

// Both invalid
sc.SomeMethod(15, 23, );
sc.SomeMethod(15, 23, z:)

إذا، ومع ذلك، استخدمت أساليب الاتصال أسماء المعلمات مختلفة، <م> قد تفعل ذلك ثم:

public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... }

sc.SomeMethod(a: 15, b: 23); // Calls second method
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top