c# – Is there any way I could replace the return type to the struct inheriting the interface, while still implementing the interface?

If you want libraries to be able to extend the structure by adding methods, without altering its storage, then you can do that via extension methods:

public static class VectorExtensions {
    public static Vector2 GetClockwisePerpendicular(this Vector2 v) {
        return new Vector2(v.y, -v.x);

This will be available to code in that assembly as though it were a member of the type itself:

var up = new Vector2(0, 1);
var right = up.GetClockwisePerpendicular();

I’d recommend this approach over the interface route you’re going now.

The main reason to use the interface would be if you want libraries to be able to change the storage of the Vector2, like adding new member variables, eg. a coordinate space or memoized length or unit direction.

The trouble with this is that now any method that accepts a Vector2 has to be able to handle many different types with different storage sizes and layouts (dynamic polymorphism). This can’t be done with raw value-type structs, so your struct gets “boxed” into a reference type object. That boxing entails a heap allocation for the garbage collector to track and reclaim, and extra indirection when manipulating the struct — costs you can most often avoid when working with data directly on the stack using a concrete struct type (ie. not an interface).

It’s not a lot, so don’t panic and remove interfaces everywhere! They’re well worth their small overhead for many situations. But for something like a vector type that you’re going to be using a lot, all this boxing and unboxing can add substantial overhead into your hot code paths.

For this reason, I would recommend not using an interface for your basic vector building blocks.