Index: src/wp-includes/class-wp-network.php
===================================================================
--- src/wp-includes/class-wp-network.php	(revision 41807)
+++ src/wp-includes/class-wp-network.php	(working copy)
@@ -148,9 +148,9 @@
 			case 'id':
 				return (int) $this->id;
 			case 'blog_id':
-				return $this->get_main_site_id();
+				return (string) $this->get_main_site_id();
 			case 'site_id':
-				return (int) $this->get_main_site_id();
+				return $this->get_main_site_id();
 		}
 
 		return null;
@@ -208,16 +208,68 @@
 	 * properties.
 	 *
 	 * @since 4.9.0
-	 * @see get_main_site_id()
 	 *
-	 * @return string Main site ID as numeric string, for compatibility reasons.
+	 * @return int The ID of the main site.
 	 */
 	private function get_main_site_id() {
-		if ( empty( $this->blog_id ) ) {
-			$this->blog_id = (string) get_main_site_id( $this->id );
+		/**
+		 * Filters the main site ID.
+		 *
+		 * Returning a positive integer will effectively short-circuit the function.
+		 *
+		 * @since 4.9.0
+		 *
+		 * @param int|null $main_site_id If a positive integer is returned, it is interpreted as the main site ID.
+		 * @param int $network_id The ID of the network for which the main site was detected.
+		 */
+		$main_site_id = (int) apply_filters( 'pre_get_main_site_id', null, $this->id );
+		if ( 0 < $main_site_id ) {
+			return $main_site_id;
+		}
+
+		if ( 0 < (int) $this->blog_id ) {
+			return (int) $this->blog_id;
+		}
+
+		if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && $this->domain === DOMAIN_CURRENT_SITE && $this->path === PATH_CURRENT_SITE )
+			|| ( defined( 'SITE_ID_CURRENT_SITE' ) && $this->id == SITE_ID_CURRENT_SITE ) ) {
+			if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {
+				$this->blog_id = (string) BLOG_ID_CURRENT_SITE;
+
+				return (int) $this->blog_id;
+			}
+
+			if ( defined( 'BLOGID_CURRENT_SITE' ) ) { // deprecated.
+				$this->blog_id = (string) BLOGID_CURRENT_SITE;
+
+				return (int) $this->blog_id;
+			}
 		}
 
-		return $this->blog_id;
+		$site = get_site();
+		if ( $site->domain === $this->domain && $site->path === $this->path ) {
+			$main_site_id = (int) $site->id;
+		} else {
+			$cache_key = 'network:' . $this->id . ':main_site';
+
+			$main_site_id = wp_cache_get( $cache_key, 'site-options' );
+			if ( false === $main_site_id ) {
+				$_sites = get_sites( array(
+					'fields'     => 'ids',
+					'number'     => 1,
+					'domain'     => $this->domain,
+					'path'       => $this->path,
+					'network_id' => $this->id,
+				) );
+				$main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0;
+
+				wp_cache_add( $cache_key, $main_site_id, 'site-options' );
+			}
+		}
+
+		$this->blog_id = (string) $main_site_id;
+
+		return (int) $this->blog_id;
 	}
 
 	/**
Index: src/wp-includes/functions.php
===================================================================
--- src/wp-includes/functions.php	(revision 41807)
+++ src/wp-includes/functions.php	(working copy)
@@ -4431,51 +4431,7 @@
 		return 0;
 	}
 
-	/**
-	 * Filters the main site ID.
-	 *
-	 * Returning anything other than null will effectively short-circuit the function, returning
-	 * the result parsed as an integer immediately.
-	 *
-	 * @since 4.9.0
-	 *
-	 * @param int|null $main_site_id If anything other than null is returned, it is interpreted as the main site ID.
-	 * @param int $network_id The ID of the network for which the main site was detected.
-	 */
-	$main_site_id = apply_filters( 'pre_get_main_site_id', null, $network->id );
-	if ( null !== $main_site_id ) {
-		return (int) $main_site_id;
-	}
-
-	if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && $network->domain === DOMAIN_CURRENT_SITE && $network->path === PATH_CURRENT_SITE )
-	     || ( defined( 'SITE_ID_CURRENT_SITE' ) && $network->id == SITE_ID_CURRENT_SITE ) ) {
-		if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {
-			return BLOG_ID_CURRENT_SITE;
-		} elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // deprecated.
-			return BLOGID_CURRENT_SITE;
-		}
-	}
-
-	$site = get_site();
-	if ( $site->domain === $network->domain && $site->path === $network->path ) {
-		$main_site_id = (int) $site->id;
-	} else {
-		$main_site_id = wp_cache_get( 'network:' . $network->id . ':main_site', 'site-options' );
-		if ( false === $main_site_id ) {
-			$_sites = get_sites( array(
-				'fields'     => 'ids',
-				'number'     => 1,
-				'domain'     => $network->domain,
-				'path'       => $network->path,
-				'network_id' => $network->id,
-			) );
-			$main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0;
-
-			wp_cache_add( 'network:' . $network->id . ':main_site', $main_site_id, 'site-options' );
-		}
-	}
-
-	return (int) $main_site_id;
+	return $network->site_id;
 }
 
 /**
Index: tests/phpunit/tests/multisite/getMainSiteId.php
===================================================================
--- tests/phpunit/tests/multisite/getMainSiteId.php	(revision 41807)
+++ tests/phpunit/tests/multisite/getMainSiteId.php	(working copy)
@@ -98,6 +98,7 @@
 	public function test_get_main_site_id_filtered() {
 		add_filter( 'pre_get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
 		$result = get_main_site_id();
+		remove_filter( 'pre_get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
 
 		$this->assertSame( 333, $result );
 	}
@@ -105,6 +106,40 @@
 	public function filter_get_main_site_id() {
 		return 333;
 	}
+
+	/**
+	 * @ticket 41936
+	 */
+	public function test_get_main_site_id_with_property_value() {
+		global $current_site;
+
+		$original_main_site_id = $current_site->blog_id;
+		$current_site->blog_id = '123';
+
+		$result = get_main_site_id();
+
+		$current_site->blog_id = $original_main_site_id;
+
+		$this->assertSame( 123, $result );
+	}
+
+	/**
+	 * @ticket 41936
+	 */
+	public function test_get_main_site_id_filtered_with_property_value() {
+		global $current_site;
+
+		$original_main_site_id = $current_site->blog_id;
+		$current_site->blog_id = '123';
+
+		add_filter( 'pre_get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
+		$result = get_main_site_id();
+		remove_filter( 'pre_get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
+
+		$current_site->blog_id = $original_main_site_id;
+
+		$this->assertSame( 333, $result );
+	}
 }
 
 endif;
