Может ли неявное преобразование использоваться для удовлетворения аргумента супертипа? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть интерфейс PropertyReference, реализация Literal и оператор неявного преобразования из int в Literal. Однако всякий раз, когда я пытаюсь использовать int, где ожидается PropertyReference, компилятор жалуется cannot convert from int to PropertyReference.

Компилятор не позволяет мне добавить оператор преобразования в PropertyReference, поскольку Interfaces cannot contain conversion, equality or inequality operators. У меня есть класс PropertyReferenceExtension stati c, и я не могу поместить туда оператор преобразования, потому что static classes cannot contain user-defined operators.

Есть ли способ выполнить неявное преобразование в подтип, чтобы соответствовать супертипу, или преобразование должно быть явный? PropertyReference и Literal находятся в одном и том же пространстве имен, и класс, в котором выполняется преобразование, уже using FooBarNamespace

Оператор, который не может быть скомпилирован.

Assert.IsTrue(BigDouble.Equals(Min.Of(1,2,3), 1));

Подпись для Min.Of

public static Min Of(params PropertyReference[] children)

Подпись для неявного преобразования

public static implicit operator Literal(int value) => new Literal(new BigDouble(value));

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

На основе https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#processing пользовательских определений неявных преобразований . Неявное преобразование будет найдено компилятором только в том случае, если оно существует либо в типе источника, либо в типе назначения, либо в одном из их базовых типов.

Так как вы пытаетесь преобразовать int в PropertyReference, только эти типы могут реализовывать неявное преобразование. Но PropertyReference - это интерфейс, который явно не разрешен. Хотя это кажется довольно произвольным ограничением.

Если бы вы преобразовали PropertyReference в абстрактный базовый класс, вы могли бы определить неявный оператор, который преобразует int в PropertyReference, создав Literal.

0 голосов
/ 16 марта 2020

Добавить перегрузку, как показано ниже?

public static Min Of(params PropertyReference[] children)
{

}

public static Min Of(params Literal[] children)
{
    return Of((PropertyReference[]) children);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...