2014-11-06 3 views
5

У меня есть эта функцияПроблем с динамическим параметром

string F(dynamic a) 
{ 
    return "Hello World!"; 
} 

позже, когда я говорю

dynamic a = 5; 
var result = F(a); 

результат должен быть во время компиляции строкового типа, но это не случились, почему? На самом деле, compilar пройти этот

int result2 = F(a); 

, а не этот

int result3 = F(5); 

Anything, пожалуйста, помогите?

+2

Do у вас есть перегрузки 'F'? – Chris

+0

Что-то здесь не складывается. Вы объявили тип возвращаемой строки и фактически возвращаете строку. Поэтому я не вижу, как можно получить результат int. –

+1

Восстанавливая свою программу, intellisense говорит мне, что 'result' тоже динамичен – Jonesopolis

ответ

6

Это объясняется в here:

разрешения перегрузки происходит во время выполнения, а не во время компиляции, если один или несколько аргументов в вызове метода имеет типа динамической, или если приемник методы вызов имеет тип динамический.

Теперь, в случае F(a), поскольку a является динамическим, компилятор не проверяет перегрузки во время компиляции. Но когда вы говорите:

F(2); 

2 является целым числом, а не dynamic. Именно поэтому разрешение перегрузки происходит во время компиляции и вы получите error.If разыгрывание целого буквального в динамическую не получит какую-либо ошибки во время компиляции (но вы на время выполнения):

int x = F((dynamic)2); 
+0

@BlueMonkMN: Ошибка возникает во время выполнения. –

+0

@BlueMonkMN, если нет перегрузки, которая возвращает int, тогда исключение произойдет во время выполнения. –

+0

Как я и ожидал. Я просто придерживаюсь фразы «вы не получите никакой ошибки». Это похоже на хорошее доказательство того, что динамическая типизация приводит к более подверженному ошибкам коду. – BlueMonkMN

Смежные вопросы