Компилятор знает только о типах, а не о значениях, и поэтому он не может определить разницу между «Case 1» и «Case 2».Вы можете либо использовать динамическую диспетчеризацию, и использовать, например, функциональный барьер, либо вы можете сообщить компилятору разницу между случаями, сделав вашу структуру параметрической.
Я быпредложите изменить код следующим образом:
struct MyStruct{T}
t::Int64
X::T
end
(я изменил структуру, чтобы она была неизменной, так как вы почти всегда должны предпочитать неизменяемые для простых структур, подобных этой).
Затем,
my_fun(A::MyStruct{Nothing}) = println("Case 1")
my_fun(A::MyStruct{Float64}) = println("Case 2")
Если вы не можете сделать это, и абсолютно необходимо для объединения типов, вместо этого вы можете использовать функциональный барьер
_my_fun(::Type{Nothing}, A::MyStruct) = println("Case 1")
_my_fun(::Type{Float64}, A::MyStruct) = println("Case 2")
my_fun(A::MyStruct) = _my_fun(typeof(A.X), A)
ОбычноЯ бы предпочел первое решение.