C# 4.0 и комбинация дополнительных параметров и перегрузок дают Вам предупреждение о неоднозначности?

Как выше.

я использую stringbuilder.append ().

Очень простой, и можно тогда сделать xmldocument.load (strinbuilder объект как параметр).

Вы будете, вероятно, использовать string.concat в добавлять параметре, но это - очень простой подход.

6
задан Lasse V. Karlsen 31 July 2009 в 07:52
поделиться

2 ответа

Он будет компилироваться без предупреждений и выберет первую перегрузку.

С введением необязательных и именованных параметров механизм разрешения перегрузки в 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);
6
ответ дан 8 December 2019 в 16:08
поделиться

Это рассматривается в разделе «Разрешение перегрузки» этой главы.

Когда у компилятора есть два варианта, которые в остальном равны, он будет использовать перегрузку, которая не требует использования каких-либо неподдерживаемых дополнительных параметров, вместо того, чтобы , но это строгий двоичный выбор. Если ему придется выбирать между перегрузкой с одним неподдерживаемым необязательным параметром и двумя, он сочтет это неоднозначной ситуацией.

Чтобы ответить на ваш последующий комментарий, я не делаю этого. Я знаю любой способ принудительно использовать перегрузку с необязательным параметром без его указания. Вы не можете использовать ни один из них, например:

// 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
9
ответ дан 8 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: