<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - Cupko</title>
		<link>https://www.cyberforum.ru/blogs/299519/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Sun, 23 Aug 2026 12:34:30 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - Cupko</title>
			<link>https://www.cyberforum.ru/blogs/299519/</link>
		</image>
		<item>
			<title>C# Перегрузка метода в наследуемом классе</title>
			<link>https://www.cyberforum.ru/blogs/299519/2766.html</link>
			<pubDate>Tue, 30 Sep 2014 11:40:37 GMT</pubDate>
			<description>Итак, не так давно натолкнулся на следующую задачку: 
 
class Program 
{ 
    static void...</description>
			<content:encoded><![CDATA[<div>Итак, не так давно натолкнулся на следующую задачку:<br />
<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="895598922"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="895598922" style="height: 318px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="de1"><pre class="de1"><span class="kw4">class</span> Program
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">static</span> <span class="kw4">void</span> Main<span class="br0">&#40;</span><span class="kw4">string</span><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">var</span> obj <span class="sy0">=</span> <span class="kw3">new</span> DerivedClass<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; obj<span class="sy0">.</span><span class="me1">SomeMethod</span><span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">class</span> BaseClass
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">internal</span> <span class="kw4">void</span> SomeMethod<span class="br0">&#40;</span><span class="kw4">int</span> a<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">class</span> DerivedClass <span class="sy0">:</span> BaseClass
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">internal</span> <span class="kw4">void</span> SomeMethod<span class="br0">&#40;</span><span class="kw4">long</span> a<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Собственно, сам вопрос был &quot;Метод какого класса выполнится при передаче интового значения?&quot;. <br />
<br />
Оказывается, выполнится метод наследуемого класса, несмотря на то, что метод базового класса более подходит по сигнатуре. И, конечно, теперь надо было разобраться почему.<br />
<br />
Мне смогли помочь с ответом, <a rel="nofollow noopener noreferrer" href="http://msdn.microsoft.com/ru-ru/library/aa691356%28v=vs.71%29.aspx" target="_blank" title="http://msdn.microsoft.com/ru-ru/library/aa691356%28v=vs.71%29.aspx">дав ссылку на спецификацию</a>.<br />
<br />
Давайте попробуем разобраться в этом:<br />
<br />
Итак,<ol style="list-style-type: decimal"><li>компилятор берет набор всех перегруженных методов объекта наследуемого типа (DerivedClass);</li>
<li>компилятор проходит по каждому методу, и проверяет на условия:<ul><li>если сигнатура метода не подходит (про проверку <a rel="nofollow noopener noreferrer" href="http://msdn.microsoft.com/ru-ru/library/aa691337(v=vs.71).aspx" target="_blank" title="http://msdn.microsoft.com/ru-ru/library/aa691337(v=vs.71).aspx">подробнее тут</a>), то это метод исключается из набора;</li>
<li>если сигнатура метода подходит, то <b>все методы, объявленные в базовом типе, исключаются из набора</b>.</li>
</ul></li>
</ol><br />
В принципе, ответ на вопрос получен. Но осталось недопонимание, что происходит с методами базового типа, если не было найдено ни единого подходящего в объекте нашего наследованного типа. Ибо в спецификации написано следующее: 
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">If the resulting set of candidate methods is empty, then no applicable methods exist, and a compile-time error occurs.</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table>при этом упоминания о заполнении исходного набора методов, методами базового типа, нет. Но это уже другой вопрос.<br />
<br />
Upd: <a rel="nofollow noopener noreferrer" href="http://csharpindepth.com/Articles/General/Overloading.aspx" target="_blank" title="http://csharpindepth.com/Articles/General/Overloading.aspx">здесь</a> более подробно описаны этот и другие интересные ситуации перегрузки методов.</div>

]]></content:encoded>
			<dc:creator>Cupko</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/299519/2766.html</guid>
		</item>
	</channel>
</rss>
