Почему языки не позволяют перегружаться методов возвращаемым значением?

В VB.NET

Public Shared Function SerializeToByteArray(ByVal object2Serialize As Object) As Byte()
    Using stream As New MemoryStream
        Dim xmlSerializer As New XmlSerializer(object2Serialize.GetType())
        xmlSerializer.Serialize(stream, object2Serialize)
        Return stream.ToArray()
    End Using
End Function

Public Shared Function SerializeToString(ByVal object2Serialize As Object) As String
    Dim bytes As Bytes() = SerializeToByteArray(object2Serialize)
    Return Text.UTF8Encoding.GetString(bytes)
End Function

В C#

public byte[] SerializeToByteArray(object object2Serialize) {
       using(MemoryStream stream = new MemoryStream()) {
          XmlSerializer xmlSerializer = new XmlSerializer(object2Serialize.GetType());
          xmlSerializer.Serialize(stream, object2Serialize);
          return stream.ToArray();
       }
}

public string SerializeToString(object object2Serialize) {
   byte[] bytes = SerializeToByteArray(object2Serialize);
   return Text.UTF8Encoding.GetString(bytes);
}
9
задан Jacob 20 October 2009 в 19:04
поделиться

6 ответов

What about this case?

class A implements Foo { /*...*/ }
class B implements Foo { /*...*/ }

A func() { return new A(); }
B func() { return new B(); }

Foo v = func(); // which do you call?!

There are already problems with ambiguity when you allow overloading of a single function name that take different arguments. Having to check the return type as well would probably make resolving the right function a lot harder.

I'm sure a language could implement that, but it would make things a lot more complicated, and would generally make the code harder to understand.

17
ответ дан 4 December 2019 в 05:54
поделиться

Допустим, это было разрешено, что бы это назвать:

func();

Возможно, это не полный ответ, но я считаю, что это одна из причин, почему это незаконно.

14
ответ дан 4 December 2019 в 05:54
поделиться

Perl допускает определенную степень вариации типа возвращаемого значения, поскольку функции могут указывать, в каком контексте они оцениваются. Например, функция, которая может возвращать массив, может видеть, что это выполняются в скалярном контексте, и просто возвращают предполагаемую длину напрямую, экономя выделение и инициализацию массива только для получения его длины.

3
ответ дан 4 December 2019 в 05:54
поделиться

For a C++ example, consider:

void g(int x);
void g(float x);
g(func());

Which of the overloaded g() functions would be called?

6
ответ дан 4 December 2019 в 05:54
поделиться

Most languages allow for mixed-mode operations with automatic coercion (e.g. float + int), where multiple interpretations are legal. Without coercion, working with multiple numeric types (short, int, long, float, double) would become very cumbersome; with coercion, return-type based disambigation would lead to hard-to-understand code.

1
ответ дан 4 December 2019 в 05:54
поделиться

Разрешение этого может вызвать проблемы. Например:

int i = func2(func());
int func() { return 5; }
float func() { return 1.3; }
int func2(float a) { return a; }
int func2(int a) { return a; }

Это неоднозначно.

1
ответ дан 4 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

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