1 Востаннє редагувалося Betterthanyou (04.10.2021 16:33:41)

Тема: call is ambiguous для null

Є два конструктори класу які приймають в якості параметра об’єкт.

public myClass(string a)
{
    // some code
}

public myClass(customClass a)
{
    // some code
}

При виклику класу зі значенням null, вилітає помилка "call is ambiguous"

myClass(null);

Можна зробити так щоб при аргументі null викликався конструктор для string (ось цей: public myClass(string a)
) ?

Зною що можна викликати так:

myClass(null as string);

Але моє питання чи можна щось змінити в самому класі myClass щоб при виклику не потрібно було вказувати що це за об’єкт для аргументу null ? Я хочу щоб при null аргументі, оприділявся конструктор з об’єктом string

Подякували: leofun011

2

Re: call is ambiguous для null

Гм. Я з загальних міркувань припустив, що усталено з null буде викликатися Object, але ні, чомусь string. Добре, почекаємо на знавців шарпу.

Подякували: leofun011

3

Re: call is ambiguous для null

Betterthanyou написав:

При виклику класу зі значенням null, вилітає помилка "call is ambiguous"

чи можна щось змінити в самому класі

Це помилка CS0121.

null є так званого типу null type, який в стандартній бібліотеці не представлений класом.
null as string є типу System.String.

Більше про це можна дізнатися на StackOverflow: 1, 2.

Враховуючи всрату архітектуру самого C# можна використати його недоліки проти нього

public class MyClass {
    public MyClass(string s) {
        // parse string
    }
    public MyClass(CustomClass a) {
        // init instance
    }
    public MyClass(NullRef n) {
        // init instance
    }
    public sealed class NullRef {
        private NullRef() { }
        public static implicit operator string(NullRef o) { return null; }
        public static implicit operator CustomClass(NullRef o) { return null; }
    }
}

Додайте вкладений тип (NullRef), який для компілятора буде більш специфічним ніж всі інші ambiguous типи, і компілятор вибере його як тип за замовчуванням для null.

Конструктори класу мають бути готовими прийняти null будь-якого reference type.

Подякували: ch0r_t, koala, Betterthanyou3